Bash中的Perl:如何从管道中读取并同时将参数传递给perl?

时间:2015-01-04 15:01:08

标签: bash perl arguments pipe

以下是我正在尝试的代码:

echo "a b c" | perl -e 'print $ARGV[0]; print $ARGV[1]; print $_;' "abc" "def"

此代码的输出为:

abcdef

我无法弄清楚为什么“打印$ _;”不像往常一样打印“a b c”。有什么想法吗?

1 个答案:

答案 0 :(得分:10)

您没有使用-n-p,因此您没有使用<>作为标准输入。如果你有参数,你不会做的。

说明:

当您使用-n-p时,它会在代码周围放置一个while(<>)循环,如下所示:

perl -ne ' print ' 

等于

perl -e ' while (<>) { print }'

如果你使用-p,那就是:

perl -e ' while (<>) { print } continue { print $_ }'

在此阶段,Perl将通过检查<>来确定@ARGV的工作方式,其中存储了脚本的参数。如果其中有任何内容,它会将参数视为文件名,并尝试打开并读取这些文件。然后将调用文件句柄ARGV。此时,<>不能用于从标准输入读取。

解决方案

换句话说,使用参数将覆盖STDIN的读数。因此,如果您想从标准输入读取,请使用该文件句柄:

echo "a b c" | perl -e ' print @ARGV[0,1]; while (<STDIN>) { print } ' foo bar

另一个选择是预先清除@ARGV数组,如下所示:

echo "a b c"|perl -ne'BEGIN { @x = @ARGV; @ARGV = () }; print @x; print;' foo bar

但是,这也会在每行输入中打印@x一次,这可能是不可取的。