Ho letto poche righe da STDIN. Come posso passare il resto di STDIN a un comando che legge dallo standard input (ad esempio md5sum
o wc
)?Perl: passa l'handle di file aperti a un programma che legge STDIN
ho potuto fare un:
read_a_few_lines_from_diamond_operator();
open (C, "|cmd");
while(<>) { print C }
close C;
cleanup_after_C();
ma per ragioni efficency Vorrei non toccare l'ingresso, ma invece passare il filehandle di STDIN. Un po 'come:
seq 10 | (read A; wc)
dove read
legge tanto quanto lo ama prima di passare il resto a wc
. Non posso usare questa soluzione, però, dato che ho bisogno di avviare il comando dal mio programma perl e ho bisogno di fare il lavoro dopo il cmd
completo.
Ho letto alcune righe dal file 'foo'. Come posso passare il resto a un comando che legge dallo standard input (ad esempio md5sum
o wc
)?
ho potuto fare un:
open (F, "<foo");
read_a_few_lines_from_F();
open (C, "|cmd");
while(<F>) { print C }
close C;
cleanup_after_C();
ma per ragioni efficency Vorrei non toccare l'ingresso, ma invece passare il resto dei file 'pippo'.
Ho la sensazione che può essere fatto utilizzando l'inganno come select
, open(FOO,">&STDOUT)
, exec 6<&0
, fork
, pipe
.
Soluzione elegante che ti fa guadagnare un pollice in su, ma ha 2 problemi: uccide perl (ho chiarito la domanda per chiarire che questo non funzionerà per me); e non tratta la seconda parte (leggendo il file 'pippo'). –
Perché non funziona? Come dice la risposta, funziona sia per 'system' che per' exec'. Esiste 'perl -e 'print <>; Sistema ("cat"); stampare "ancora qui \ n" '
tripleee
Ben individuato. Funziona così: 'seq 10 | perl -e 'sysread (STDIN, $ a, 1); stampare "$ a bar"; system ("cat"); stampa "ancora qui \ n" ''. Lascia comunque leggere il file 'foo'. –