Linux 带有Bash内参数的Perl标准输入

Linux 带有Bash内参数的Perl标准输入,linux,perl,bash,unix,stdin,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 } } 正确的方法是什么,以

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

试试:

foo=`cut -f1,2 file1.txt`
myperl.pl $foo | sort -u
我猜您正在尝试将cut命令的输出作为参数“foo”传递到myperl.pl脚本。

很特殊:它从标准输入或命令行上列出的每个文件返回行。因此,命令行中的参数被解释为要打开的文件名和要从中返回的行。因此,错误提示msgs无法打开文件
foo

在您的情况下,您知道您想从
读取数据,所以只需使用它而不是


要在perl尝试将参数作为输入打开之前获取该参数,请使用
BEGIN
块:

失败

cat file | perl -ne '$myarg=shift; if ($myarg eq "foo") {} else {}' foo #WRONG
cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo
无法打开foo:没有这样的文件或目录。

但是这个起作用了

cat file | perl -ne '$myarg=shift; if ($myarg eq "foo") {} else {}' foo #WRONG
cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo

我特别想在Bash脚本中调用perl。($input)Perl对吗?哇,对!现在它应该在bash中工作。确保键入foo=
cut-f1,2 file1.txt
而不是foo=
cut-f1,2 file1.txt
是否有特殊原因不使用Perl来剪切file1.txt的第一和第二个字段?因为您使用的是Perl,所以您可以用Perl做任何事情,包括排序。这让许多Perl用户感到痛苦。这是为了模仿几个基本unix命令的语法而设计的;例如,这个程序的工作原理(大致)与“cat”:while(){print;}
cat file | perl -ne 'BEGIN {$myarg=shift}; if ($myarg eq "foo") {} else {}' foo