13

出于我的懒惰,这个问题是必要的,因为我有几十个脚本以简单的结构执行:

perl my_script.pl my_input_file

...并将输出打印到标准输出。但是,现在我意识到在某些情况下,我想将输入通过管道传输到这些脚本中。所以,像这样:

perl my_script.pl my_input_file | perl my_next_script.pl | perl third_script.pl > output

有谁知道在不重新编码我的所有脚本以接受标准输入而不是用户定义的输入文件的情况下做到这一点的方法?我的脚本通过如下语句查找文件名:

open(INPUT,$ARGV[0]) || die("Can't open the input file");

感谢您的任何建议!

4

2 回答 2

16

-用作文件名

perl my_script.pl my_input_file | perl my_next_script.pl - | perl third_script.pl - > output
于 2013-10-18T18:36:37.770 回答
10

mpapec提供了最简单的解决方案。我想推荐钻石运营商:<>

在你会做的脚本中

open my $fh, "<", $ARGV[0] or die $!;
while (<$fh>) { 
    ... 

您可以使用菱形运算符替换大部分代码

while (<>) {
    ...

ARGV如果您使用参数文件名,则文件句柄名称将是,否则STDIN。文件名将在$ARGV.

该运算符调用 Perl 从文件名参数或标准输入中查找输入的行为。

这意味着无论你做

inputpipe | script.pl

或者

script.pl inputfile.txt

钻石算子会很好地接受输入。

注意:你的open说法很危险。您应该使用三个参数 open 与显式模式和词法文件句柄。die与其相连的语句应包含错误变量$!,以提供有关打开失败原因的信息。

于 2013-10-18T18:56:35.207 回答