perl
|
30.10.2008 15:02
Martin
|
1. potrebuju rozdelit radu znaku, tak ze po kazdem 6.znaku bude odradkovani(\n)
Priklad: 123456123456123456 na
123456
123456
123456
2.chci smazat text od urciteho radku, jinak: vim co obsahuje radek od ktereho chci smazat zbytek textu. Jak? |
|
|
Re: perl
|
30.10.2008 16:09
Hynek (Pichi) Vychodil
|
Nějaká školní úloha?
1.
perl -e 'my $a = "123456123456123456"; $a =~ s/(.{6})/$1\n/g; print $a'
2.
echo -e "a\nb\nc\nhere\nd\ne" | perl -ne 'not(/here/ .. eof) and print' |
|
|
Re: perl
|
31.10.2008 16:21
Martin
|
Mam v poli (@pole) data typu 00 01 00 02 00 03 00 04 .. .. .. a to potrebuju rozdelit na 00 01 odradkovat 00 02 odradkovat tj. po kazdem 6.znaku odradkovat.
@pole =
foreach $rada (@pole) {
$radek =~ a v tomto miste se mi nedari dosahnout toho odradkovani
}
a pak tam potrebuju naprogramovat to smazani od urciteho radku, z vasi odpovedi jsem to nepochopil, mohl by jste mi pomoci ze to napisete tak ze to klic.slovo na radku bude napr. Slovo15
dekuji |
|
|
Re: perl
|
31.10.2008 18:52
Hynek (Pichi) Vychodil
|
Zásadní otázka je odkud se ta data vezmou a kam mají přijít. Mnou uvedené ukázky úlohu řeší, ale díky tomu, že tyto zásadní okrajové podmínky nebyly definovány, tak jsem si je zvolil tak, aby bylo řešení pro mě co nejjednodušší. Dokud nenapíšete jasně proč, odkud kam se má co? Tak se nehneme z místa. Prostě nedostatečně zadaná úloha. Vzhledem k tomu, že mám za sebou profesionálně naprogramováno desítky tisíc řádek perl kódu, tak vám můžu zcela seriózně říci, že těch řešení takové množství, že si to asi ani nedokážete představit. Všimněte, že klasická školní úloha bývá zadána ve stylu: čísla se budou číst ze standardního vstupu, udělá se s nimi tohle a tohle a výsledek se zobrazí na standardní výstup. Nebo vstup se načte ze souboru a výstup se pošle na tiskárnu a podobně. Stejně tak v profesionálním programování se definuje, že se data dostanou v takové a takové formě a výsledek se pošle dál v jiné formě. Nikdy se nedefinuje jen ten prostředek. Bez toho je to zadání k ničemu a výsledek takové práce taktéž. Například, ta druhá úloha se podstatně jinak řeší, když to má být řádková utilita, tak jak jsem to naprogramoval, než když se to řeší v rámci nějakého složitějšího programu a úplně jinak když vstupem je například pole. Stejně tak když ty data mám poslat na STDOUT, nebo dál zpracovat. |
|
|
Re: perl
|
3.11.2008 08:35
Martin
|
Data zisjam na zaklade dotazu na prislusny stroj, tom vas nebudu zatezovat. Ktery mi vrati "pole cisel" ve tvaru jak jsem psal. A vystup nikam posilat zatim nechi, pac je hodlam dal zpracovavat do grafu (gnupolot). Potrebuji, upravit pole na mou potrebu, tj.aby kazdy radek byl ve tvaru 00 xx (tzn. 00 01 nebo 00 4C..) pote jeste budu potrebovat cisla prevest do desitkovy soust. jelikoz tyto jsou v hexa.
Tudiz v poli @vypis mam cisla ve tvaru
00 01 00 02 00 01 00 01 00 01 00 01 00 01 00 01
00 01 00 01 00 01 00 01 00 01 00 01 00 08 00 2C
00 4C 00 2C 00 08 00 02 00 01 00 01 00 01 00 01
..
..
a chci tvar
00 01
00 02
00 01
..
..
a to ve 32 bloku po 16x16 cisel, posledich 16bloku potrebuji smazat a zbyvajicich prvnich 16 upravit na prislusny tvar. Kazdy blok je uvozen jeste slovem Hex-STRING.1 az 32. Ale ty smazat dokazu.. |
|
|
Re: perl
|
3.11.2008 09:36
Martin
|
Menim dotaz!
Mam "to" pole o 500radcich, a chci ho od 250 radku smazat. Bud vim cislo radku(tj.ten 250), nebo co v nem je obsazeno (neco jako Hex-STRING.17).
|
|
|
Re: perl
|
3.11.2008 10:52
Hynek (Pichi) Vychodil
|
Opět si musím spoustu věcí domýšlet, ale budiž
my @result;
foreach (@vypis) {
last if /^Hex-STRING\.17/;
s/^Hex-STRING\.\d+//;
s/\s//g;
push @result, map {ord} split//, pack("H*", $_);
} A jsou z toho rovnou ty výsledná čísla. |
|
|
Re: perl
|
3.11.2008 10:57
Hynek (Pichi) Vychodil
|
A safra. Zapoměl jsem, že je to po dvou.
Tak tedy:
<pre>
my @result;
foreach (@vypis) {
last if /^Hex-STRING\.17/;
s/^Hex-STRING\.\d+//;
s/\s//g;
push @result, unpack( "n*", pack( "H*", $_ ) );
}
</pre>
|
|
|
Re: perl
|
3.11.2008 11:00
Hynek (Pichi) Vychodil
|
A safra. Zapoměl jsem, že je to po dvou.
Tak tedy:
my @result;
foreach (@vypis) {
last if /^Hex-STRING\.17/;
s/^Hex-STRING\.\d+//;
s/\s//g;
push @result, unpack( "n*", pack( "H*", $_ ) ); }
|
|
|
Re: perl
|
3.11.2008 11:11
Martin
|
Dekuji, vyresil jsem to jinak, ale dekuji. Kouknu na to. Jiz mam posledni problem:
Mam ty cisla vypsane pod sebou ale jsou v hexa. tj. napr.4C 13 1B a potrebuju je do desitkovy..
Cisla mam v promnene $tmp, tudiz kdyz si dam print $tmp vyise se mi napr.
01
00
13
1B
4C
..
..
a chci je prevest, uz jste mi jednou radil s prevodem do osmickove pres pack.., ale nakonec jsem se tomu vyhnul formatovanim pres sprintf, ale pres sprintf mi to ed nejde. |
|
|
Re: perl
|
3.11.2008 11:24
Hynek (Pichi) Vychodil
|
Nerozumim, mě to funguje:
perl -le 'my @vypis = <>; my @return;
foreach (@vypis) {
last if /^Hex-STRING\.17/;
s/^Hex-STRING\.\d+//;
s/\s//g;
push @result, unpack( "n*", pack( "H*", $_ ) );
}
print foreach @result;' <<EOF
Hex-STRING.1 00 01 00 02 00 01 00 01 00 01 00 01 00 01 00 01
Hex-STRING.2 00 01 00 01 00 01 00 01 00 01 00 01 00 08 00 2C
Hex-STRING.3 00 4C 00 2C 00 08 00 02 00 01 00 01 00 01 00 01
Hex-STRING.17 00 4C 00 2C 00 08 00 01 00 01 00 01 00 08 00 2C
Hex-STRING.18 00 01 00 01 00 01 00 01 00 01 00 01 00 08 00 2C
EOF
1
2
1
1
1
1
1
1
1
1
1
1
1
1
8
44
76
44
8
2
1
1
1
1
|
|
|
Re: perl
|
3.11.2008 11:35
Martin
|
Omlouvam se za vas cas! Muj problem je ze se nejdriv ptam a potom myslim..
Stacilo pridat "slovo" hex pri prirazovani do promene.
jeste jednou se omlouvam. A DEKUJI. |
|
|
Re: perl
|
3.11.2008 15:07
Martin
|
Prece jen bych mel dotaz, potreboval bych vysvetlit jak funguje ten prevod z Hexa do desitkovy soustavy.
Nejlepe s komentarem koukal jsem i do perldoc ale neni mi to jasne. Nejlepe na prikladu jednoduchem prikladu. Neco jako priklad: mam v $num_hexa = 4c; preved ho do desitove soust.
|
|
|
Re: perl
|
3.11.2008 16:27
Hynek (Pichi) Vychodil
|
Co se týče pack a unpack, tak většinou to musím vždycky zkusit. Celé je to takové zmatené. Například u pack v template aAZ znamená v jakém formátu bude výsledek a u všeho ostatního co je vstupní hodnotou. Co je ale důležité vědět, tak výstupem pack je binárně zakódovaný výsledek a ten je vstupem unpack. Takže když mám vstup hexa číslo (ve skutečnosti string obsahující znaky toho hexa zápisu) tak to musím převést do binárky, kde každý byte bude odpovídat příslušné dvojici perl -le 'print pack("H2", "4c")' . Výsledkem je binary string obsahující jeden znak "L" s hodnotou v hexa 4c. A teď když tu binárku chci rozpakovat na číslo nebo string v jiném formátu, tak musím použít unpack. Jeden byte je char, tedy perl -le 'print unpack("C", pack("H2", "4c"))' mi to převede na jedno číslo, které mi říká jaká hodnota toho byte je. Pokud mám dva hexa byte, tak je to převod pomocí unsigned short v big-endian perl -le 'print unpack("n", pack("H4", "014c"))' . Aby to všechno běhalo hodně rychle, tak je nejlepší to celé zpracovávat jedním vrzem a proto perl -le 'print join ",", unpack("n*", pack("H*", "014c0001000200080080"))' , které je v perlu skutečně výkonné. |
|
|
|
|
KOMENTARZE
|
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
|
Szukanie oprogramowania
|