Zacatecnicky dotaz
Milan Plsek
linux na brno-city.cz
Úterý Červenec 20 11:30:27 MEST 1999
Zdravim vsechny,
omlouvam se za mozna jednoduchy dotaz (a obsahlost mailu), ale jsem jiz
naprosto zoufaly a moje kniha i man se v tomto smeru zdaji naprosto k
nicemu. Delam svuj prvni program v perlu a vubec me nenapada jak na to. O
co jde: program by mel vytahnout z logu ip adresu a kolik toho ta adresa
stahovala. Na to jak to udelat jsem prisel, ale bohuzel se mi nepodarilo
zjistit jak to zaonacit, aby se ta ip adresa vypsala pouze jednou s
vypocitanou hodnotou a ne:
10.1.1.12 120 // ta 120 znamena 120 bytu a je to udaj na 1.radce logu
10.1.1.12 150 // z druhe radky logu pricetl 30 bytu
atd.
/* ja ale chci aby se zobrazilo pouze a jenom 10.1.1.12 150 a pak
rovnou dalsi jinou ip adresu -to jak se to prirazuje postupne me vubec
nezajima*/ ~~~~~
zdrojak:
~~~~~~~~~~~~~~~~~~
open(LOG,"log") or die "LOG:$!\n";
while($zaznam = <LOG>) {
($serial, $any, $ip, $protocol, $size, $metoda, $adresa, $c1, $direct,
$c2) = split(" ",$zaznam);
$velikost{$ip} += $size ." ";
foreach $ip (sort keys %velikost) {}
open(FAO, ">>fao") or die "FAO:$!\n";
print FAO "$ip,$velikost{$ip}", "\n";
close FAO;
}
# zkousel jsem to vyresit nasledujici obezlickou: jelikoz je pole (v teto
# chvili ulozene do handleru FAO ) usporadano vzestupne, rikal jsem si, ze
# bych k nemu mohl pristupovat od konce a pritom testovat jestli uz v tom
# nove vytvarenem poli neco takoveho neni a kdyz ano tak aby skocil na
# dalsi cyklus. Narazil jsem vsak na problem: bud jsem po prvnim cyklu
# sestavil cele pole a hledani pres grep tudiz zobrazilo jedinou adresu, a
# nebo (kdyz jsem se pokousel prirazovat to do pole po jen radkach ) se mi
# priradil v 1.cyklu 1. zaznam; v 2.cyklu 1.zaznam a 2.zaznam takze to
# vypadalo takto :1.zaznam,1.zaznam,2.zaznam atd. Jak je videt z tohoto:
open (FAO, "fao") or die "FAO:$!\n";
while (@udelej = <FAO>) {
open (VYSLED,">>vysled") or die "VYSLED:$!\n";
foreach $radek (@udelej) {
@ipradek = split(',',$radek);
$dalsi = grep $ipradek[0], @dohro;
next if $dalsi != 0;
unshift @dohro, $radek;
print VYSLED @dohro;
close VYSLED;
}
close FAO;
close LOG;
}
Budu vdecny za kazdou radu. Eventualne resil-li nekdo z Vas neco podobneho
mohli byste mi to poslat k nahlednuti ? Nejlepsi by bylo kdyby to slo
nejak testovat uz pro vytvareni tech hashu - zkratka nevim uz nekolikrat
jsem si myslel, ze jsem na spravne stope a misto toho ... Doufam, ze to
nebudu muset delat v C, nebo bashi.
S pozdravem
Milan
Další informace o konferenci Perl