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