![使用 Perl 脚本进行流程替换](https://linux22.com/image/180949/%E4%BD%BF%E7%94%A8%20Perl%20%E8%84%9A%E6%9C%AC%E8%BF%9B%E8%A1%8C%E6%B5%81%E7%A8%8B%E6%9B%BF%E6%8D%A2.png)
我有一个 Perl脚本这需要以下参数:
count.pl OUTPUT_FILE INPUT_FILE
我想要做的是使用进程替换而不是显式指定 INPUT_FILE,例如:
count.pl count.txt <(cat test.txt)
但是,该脚本似乎没有从进程替换接收任何输入。
我做错了什么?
答案1
剧本用途-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
看看-T
输出中已经消耗了 8KiB 的数据,而seq
这些数据已经不再可供while <F>
循环读取。
在这里,您可以使用 zsh 及其=(...)
使用临时文件而不是管道的进程替换形式。或者(... | psub -f)
在fish
壳里。或者-T
从该脚本中删除该调用。或者重写该脚本,使其与<<>>
/一起工作<>
(因此,当未传递任何文件参数时,它也可以在 stdin 上工作)并在 stdout 上输出。我真的不明白它将文件名作为参数的意义,因为它以流方式处理所有文件。