使用 Perl 脚本进行进程替换

And*_*rej 4 bash perl process-substitution

我有一个需要以下参数的 Perl脚本

count.pl OUTPUT_FILE INPUT_FILE
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用进程替换而不是显式指定 INPUT_FILE,例如:

count.pl count.txt <(cat test.txt)
Run Code Online (Sandbox Code Playgroud)

但是,脚本似乎没有收到来自进程替换的任何输入。

我做错了什么?

Sté*_*las 7

该脚本用于-T the-source-file确定文件是否包含文本

-T运算符读取文件的开头并使用启发式方法来确定它是否看起来像文本。但是,如果文件是像这种<(...)情况下的管道,那么它所读取的内容将无法再次读取。

您可以使用以下方法进行复制:

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

1861
1862
1863
1864
1865
1866
1867
Run Code Online (Sandbox Code Playgroud)

查看如何-Tseq不再存在while <F>循环读取的输出中消耗 8KiB 。

在这里,您可以使用 zsh 及其=(...)使用临时文件而不是管道的进程替换形式。或者(... | psub -f)fish外壳中。或者-T从该脚本中删除该调用。或者重写该脚本,使其与<<>>/ 一起使用<>(因此它也可以在未传递任何文件参数时在 stdin 上工作)并在 stdout 上输出。我真的不明白它将文件名作为参数的意义,因为它以流方式处理所有文件名。