Newsgroup: it.comp.lang.perl
Titolo: Catturare output prg da perl

Avrei bisogno di catturare l'output del comando tcpdump da uno script in
perl per eseguire dei controlli, tra cui l'aggiornamento di un contatore su
file
Avrei pensato a qualcosa del tipo: tcpdump <parametri> | ./
miofile.pl
al''interno dello script eseguire un while contenente la lettura dello STDIN
ma purtroppo non funziona.
C'è qualcuno che mi sa dire come fare?
Grazie
Luca

ma purtroppo non funziona.
Dovrebbe funzionare. Comunque sia puoi anche utilizzare, da dentro il
programma:
$output = `tcpdump parametri`;
	Michele.
-- 
Michele Beltrame
m...@io.com
http://www.io.com/~mick/
ICQ# 76660101
==> FAQ di it.comp.lang.perl: 
http://www.borders.it/perl/faq/
==> Sei del triveneto e vuoi unirti ai Perl Mongers? Scrivimi!

	Michele.
mmmh ma non è 
meglio così?? 
@output=`tcdump ecc..`
Fabrizio

@output=`tcdump ecc..`
Beh, dipende da come vuoi l'output essenzialmente. ;)



ci sarebbero vantaggi ad usare uno o l'altro?
Fabrizio

ci sarebbero vantaggi ad usare uno o l'altro?
La questione e` semplicemente questa: se vuoi l'output diviso in righe,
usi la sintassi con @output, se invece vuoi che esso sia raccolto in
una sola variabile scalare allora usi $output. Non c'e` alcun altro
motivo che induca a preferire l'uno o l'altro. ;)
	A presto, Michele.


 motivo che induca a preferire l'uno o l'altro. ;)
Ho perso il primo messaggio di Fabrizio, ma se l'alternativa era usare 
 @array = `tcpdump ...`;
 
suggerirei di dimenticarla.
tcpdump genera notoriamente TONNELLATE di output, se non gli si mettono
dei flag adeguati, e il rischio che si corre e' che @array diventi enorme
e occupi tutta la memoria, prima di poter significativamente esaminare
l'output.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

l'output.
e che differenza ci sarebbe, come in questione, 
con $out = `tcpdump`?
Oha

con $out = `tcpdump`?
Mi sono perso il post a cui ti rifersci, di che data era ??? (mi sa
vecchio).
Te lo spiego con il caso classico, quello del file:
open(FILE,"./archivio.dat");
@file=<FILE>;
close FILE;
print @file;
Bene, questo programma apre il file archivio.dat e poi l'array @file lo
memorizza tutto. Alla fine si chiude il file. Poi il tutto viene stampato !
Dopo di che si lavora su @file. Tale variabile contiene (in generale) tante
righe quante erano i gli a capo nel file. Supponiamo che il file sia
composto da circa 5000 righe, allora l'array ha circa 5000 elementi
($file[0] etc..) ognuno dei quali e' una stringa di media lunghezza.
Insomma abbiamo in memoria 5000 stringhe !!!
open(FILE,"./archivio.dat");
print while(<FILE>);
close FILE;
Oltre ad essere piu' breve (1 riga in meno), ha il vantaggio (molto grosso)
che non carica 5000 righe in memoria, ma solo una alla volta, per 5000 volte
! Insomma occupa 5000 volte meno memoria dell'esempio precedente (non male
come differenza !).
Insomma credo che il (giustissimo) consiglio che ti sia stato dato e' quello
di sostituire l'array con una variabile normale ed un ciclo. Anche in questo
caso usiamo una variabile normale, solo che e' la variabile implicita $_ ,
e' come se avessi scritto print $_;
Ricordati che i server hanno moltissima memoria, e' vero, ma anche
moltissimi processi attivi !!!
ALex




L'alternativa, se ben ricordo, era aprire ricevere l'uscita di tcpdump riga
per riga, o usando il programma perl dopo una pipe, o aprendo un file su
'tcpdump|'.
Il succo e' che leggere ed elaborare l'input riga per riga e' piu' efficente
che accumulare l'input in un array e poi elaborarlo. 
Con le quintalate di output di tcpdump questo consiglio ha ancora piu' senso.
