Processus de substitution avec un script Perl

Sep 30 2020

J'ai un script Perl qui nécessite les arguments suivants:

count.pl OUTPUT_FILE INPUT_FILE

Ce que je veux faire, c'est utiliser la substitution de processus au lieu de spécifier explicitement INPUT_FILE, par exemple:

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

Cependant, il semble que le script ne reçoive aucune entrée de la substitution de processus.

Qu'est-ce que je fais mal?

Réponses

7 StéphaneChazelas Sep 30 2020 at 18:31

Le script utilise-T the-source-file pour déterminer si le fichier contient du texte .

Cet -Topérateur lit le début du fichier et utilise l'heuristique pour déterminer s'il ressemble ou non à du texte. Mais si le fichier est un tube comme dans le <(...)cas, alors ce qu'il a lu ne peut pas être lu à nouveau.

Vous pouvez reproduire avec:

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

1861
1862
1863
1864
1865
1866
1867

Voyez comment -Ta consommé 8 Ko à partir de la sortie seqdont il n'y a plus while <F>de lecture de la boucle.

Ici, vous pouvez utiliser zsh et sa =(...)forme de substitution de processus qui utilise un fichier temporaire au lieu d'un tube. Ou (... | psub -f)dans la fishcoquille. Ou supprimez cet appel à -Tde ce script. Ou réécrivez ce script pour qu'il fonctionne avec <<>>/ <>(donc il fonctionnerait également sur stdin s'il n'est passé aucun argument de fichier) et sort sur stdout. Je ne vois pas vraiment l'utilité de prendre les noms de fichiers comme arguments car il les traite tous en flux.