Sustitución de procesos con script Perl

Sep 30 2020

Tengo un script en Perl que requiere los siguientes argumentos:

count.pl OUTPUT_FILE INPUT_FILE

Lo que quiero hacer es usar la sustitución de procesos en lugar de especificar INPUT_FILE explícitamente, por ejemplo:

count.pl count.txt <(cat test.txt)

Sin embargo, parece que el script no recibe ninguna entrada de la sustitución del proceso.

Que estoy haciendo mal

Respuestas

7 StéphaneChazelas Sep 30 2020 at 18:31

La secuencia de comandos se utiliza-T the-source-file para determinar si el archivo contiene texto .

Ese -Toperador lee el inicio del archivo y usa heurística para determinar si se ve como texto o no. Pero si el archivo es una tubería como en el <(...)caso, entonces lo que ha leído no se puede volver a leer.

Puedes reproducir con:

$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)

1861
1862
1863
1864
1865
1866
1867

Vea cómo -Tha consumido 8KiB de cuya salida seqya no están allí para que el while <F>bucle los lea.

Aquí, puede usar zsh y su =(...)forma de sustitución de procesos que usa un archivo temporal en lugar de una tubería. O (... | psub -f)en el fishcaparazón. O elimine esa llamada a -Tde ese script. O reescriba ese script para que funcione con <<>>/ <>(por lo que también funcionaría en stdin cuando no se pasa ningún argumento de archivo) y genera en stdout. Realmente no veo el sentido de que tome nombres de archivo como argumentos, ya que los procesa todos en forma de flujo.