Portál AbcLinuxu, 13. května 2025 21:57
`cat *.txt >all`;(samozrejme existuje milion jinejch zpusobu)
; @g = (); @b = (); $map{"g"} = \@g; $map{"b"} = \@b; open(F, "file.txt"); while (<F>) { if (m/(.*):(.*)/) { push @{ $map{$1} }, $2; } } close(F); print "G:\n"; for $i (@g) { print "\t$i\n"; } print "B:\n"; for $i (@b) { print "\t$i\n"; }ocekava se ze file.txt bude ve formatu:
g:nick1 g:nick2 b:nick3 b:nick4 g:nick5 ...
Nebo to rozdel do sekci a identifikator dej pouze pred prvni zaznam dane sekce (neco na zpusob *.ini souboru ve Windows). Zpusob zapisu oddelovace si zvol jaky ti vyhovuje - napriklad
[nazev sekce] data data
nebo
::nazev sekce data data
nebo
nazev sekce: data data
atd.
Spojeni do jednoho souboru muzes udelat napriklad takto
for X in *.txt; do echo "[${X%.txt}]">>all.txt; cat $X >>all.txt; done
Puvodni jmena souboru (bez pripony) jsou pouzity jako oddelovace/nazvy sekci. Vysledny soubor s daty tedy muze vypadat takto
[kluci] mnick1 # komentar mnick2 mnick3 [holky] fnick1 fnick2 fnick3
Pokud vylozene nepotrebujes extra promenne tak bych to pak nacital do HASHe - treba nasledujicim zpusobem
my %data; my $line; my $sekce = 'neznama'; my $config = 'all.dat'; # nacteme data/konfiguraci if (open(DATAIN, $config)) { while ($line = <DATAIN>) { chomp($line); next if ($line =~ /^\s*$/); next if ($line =~ /^\s*#/); if ($line =~ /^\s*\[([^\]]+)]\s*$/) { # nalezena nova sekce dat $sekce = $1; $sekce =~ s/^\s*//; $sekce =~ s/\s*$//; } else { # cteme data push @{$data{$sekce}}, $line; } } # data nactena - zavreme soubor close(DATAIN); } else { die("Nelze otevrit soubor '$config'"); } # pokracuje vlastni kod programu # ...
Jednotlive kategorie/seznamy jsou pristupne jako @{$data{'jmeno seznamu'}}
(napr.: @{$data{holky}}
a polozky pak $data{'jmeno seznamu'}[index]
(napr.: $data{'holky'}[1]
. Seznam vsech nactenych kategorii/seznamu ziskas pomoci keys %data
.
Diky za doporuceni a odkaz na CPAN. Pro vasi informaci na CPANu mam nekolik modulu a vyvoj v PERLu mne i pred lety zivil. Pri pouzivani CPAN modulu jsem bohuzel casto narazil na velmi promenlivou kvalitu kodu a dokumentace. Velmi casto je k dispozici nekolik modulu pro stejny ukol a zadny z nich to nedela poradne… To je ale namet na uplne jinou a poradne dlouhou diskusi.
Po precteni tazatelova prispevku jsem mu chtel ukazat kousek PERLoveho kodu a silu PERlu. Tazatel zrejme prechazi z C ci neceho podobneho. Pri pouhem uvedeni odkazu na CPAN ci konkretni modul tak tazatel zrejme zustane u psani ceckoveho kodu v PERLu a nevyuzije silu a prednosti tohoto jazyka.
Napriklad pokud pouze plnim pole, nepotrebuji si udrzovat index posledniho prvku, tedy namisto
$holky[$a] = $radek; $a++;
lze jednoduse pouzit
push @holky, $radek;
Pokud potrebuji pocet prvku, ziskam jej z @holky
ve skalarnim kontextu, jenz si lze vynutit pomoci scalar(@holky)
. Index posledniho prvku pak je $#holky
. Tazatel take jeste prilis nezna kouzlo regularnich vyrazu umoznujici volnost v psani zaznamu ve vstupnim souboru (napriklad volitelne mezery jenz nekdy text udelaji pro cloveka prehlednejsim) namisto pouziti substr()
kde musim mit zaznam presnou strukturu.
open(my $input, ...)
místo open(INPUT, ...)
. Vypadá to jako nuance ale má to dalekosáhlé dopady (k lepšímu). A také není potřeba mít if...else otevření selhalo
, ale stačí použít autodie
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.