Leí algunas líneas de STDIN. ¿Cómo puedo pasar el resto de STDIN a un comando que se lee desde la entrada estándar (por ejemplo, md5sum
o wc
)?Perl: Pase el manejador de archivo abierto a un programa que lee STDIN
que podía hacer un:
read_a_few_lines_from_diamond_operator();
open (C, "|cmd");
while(<>) { print C }
close C;
cleanup_after_C();
pero por razones efficency me gustaría no tocar la entrada, pero en lugar de pasar el gestor de archivo STDIN. Algo así como:
seq 10 | (read A; wc)
donde read
lee tanto como le gusta antes de pasar el resto a wc
. Sin embargo, no puedo usar esta solución, ya que necesito iniciar el comando desde dentro de mi programa perl y necesito hacer el trabajo después de que el cmd
finalice.
He leído algunas líneas del archivo 'foo'. ¿Cómo puedo pasar el resto a un comando que se lee desde la entrada estándar (por ejemplo, md5sum
o wc
)?
que podía hacer un:
open (F, "<foo");
read_a_few_lines_from_F();
open (C, "|cmd");
while(<F>) { print C }
close C;
cleanup_after_C();
pero por razones efficency me gustaría no tocar la entrada, sino que se pasa el resto del archivo 'foo'.
Tengo la sensación de que puede ser hecho usando trucos como select
, open(FOO,">&STDOUT)
, exec 6<&0
, fork
, pipe
.
Solución elegante que le gana el pulgar hacia arriba, pero tiene 2 problemas: Mata a perl (he aclarado la pregunta para dejar en claro que esto no funcionará para mí); y no trata con la segunda parte (leyendo el archivo 'foo'). –
¿Por qué no funciona? Como dice la respuesta, funciona tanto para 'system' como' exec'. Tiene 'perl -e 'print <>; sistema ("cat"); imprimir "todavía aquí \ n" '
tripleee
Bien manchado. Esto funciona: 'seq 10 | perl-e 'sysread (STDIN, $ a, 1); imprimir "$ a bar"; sistema ("cat"); imprimir "todavía aquí \ n" ''. Sin embargo, todavía deja de leer el archivo 'foo'. –