Sostituzione del processo con script Perl

Sep 30 2020

Ho uno script Perl che richiede i seguenti argomenti:

count.pl OUTPUT_FILE INPUT_FILE

Quello che voglio fare è utilizzare la sostituzione del processo invece di specificare INPUT_FILE esplicitamente, ad esempio:

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

Tuttavia, sembra che lo script non riceva alcun input dalla sostituzione del processo.

Cosa sto sbagliando?

Risposte

7 StéphaneChazelas Sep 30 2020 at 18:31

Lo script utilizza-T the-source-file per determinare se il file contiene testo .

Questo -Toperatore legge l'inizio delle euristiche file e utilizza per determinare se sembra che il testo oppure no. Ma se il file è una pipe come nel <(...)caso, ciò che ha letto non può essere letto di nuovo.

Puoi riprodurre con:

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

1861
1862
1863
1864
1865
1866
1867

Guarda come -Tha consumato 8KiB dal cui output seqnon ci sono più per il while <F>ciclo da leggere.

Qui è possibile utilizzare zsh e la sua =(...)forma di sostituzione del processo che utilizza un file temporaneo invece di una pipe. O (... | psub -f)nel fishguscio. Oppure rimuovi quella chiamata a -Tda quello script. Oppure riscrivi lo script in modo che funzioni con <<>>/ <>(quindi funzionerebbe anche su stdin quando non viene passato alcun argomento del file) e restituisce lo stdout. Non vedo davvero il punto di prendere i nomi dei file come argomenti poiché li elabora tutti in modo fluido.