在Bash中使用参数的Perl标准输入

时间:2010-04-12 08:16:20

标签: linux perl bash unix stdin

我想在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脚本可以接收标准输入和参数 在同一时间?

3 个答案:

答案 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脚本。