我想在bash中使用这样的管道
#! /usr/bin/bash
cut -f1,2 file1.txt | myperl.pl foo | sort -u
现在在myperl.pl
它有这样的内容
my $argv = $ARG[0] || "foo";
while (<>) {
chomp;
if ($argv eq "foo") {
# do something with $_
}
else {
# do another
}
}
但为什么Perl脚本无法识别通过bash传递的参数? 即代码打破了这条消息:
Can't open foo: No such file or directory at myperl.pl line 15.
正确的方法是什么,以便我的Perl脚本可以接收标准输入和参数 在同一时间?
答案 0 :(得分:6)
<>
很特殊:它从标准输入或命令行中列出的每个文件返回行。因此,命令行中的参数被解释为要打开的文件名和从中返回行。因此错误消息无法打开文件foo
。
根据您的情况,您知道要从<stdin>
读取数据,因此只需使用<>
而不是while(<stdin>)
:
foo
如果要保留在命令行上可选指定输入文件的功能,则需要在使用@ARGV
之前从<>
删除参数my $firstarg = shift(@ARGV);
...
while (<>) {
...
if ($firstarg eq "foo") ...
:
{{1}}
答案 1 :(得分:1)
要在perl尝试将其作为输入打开之前获取参数,请使用BEGIN
块:
失败:
cat file | perl -ne '$myarg=shift; if ($myarg eq "foo") {} else {}' foo #WRONG
说Can't open foo: No such file or directory.
但有效:
cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo
答案 2 :(得分:0)
尝试:
foo=`cut -f1,2 file1.txt`
myperl.pl $foo | sort -u
我猜你正试图将cut命令的输出作为参数“foo”传递给myperl.pl脚本。