xargs将多个参数传递给perl子例程?

时间:2019-05-18 14:40:09

标签: perl arguments pipe xargs

我知道如何管道multiple arguments with xargs

echo a b | xargs -l bash -c '1:$0 2:$1'

我知道如何将参数数组从xargs传递到我的perl模块的子例程:

echo a b | xargs --replace={} perl -I/home/me/module.pm -Mme -e 'me::someSub("{}")'

但是我似乎无法使用这些美元引用(以满足me::someSub签名)将多个参数传递给perl:

echo a b | xargs -l perl -e 'print("$0 $1")'

只需打印:

  

-e

那么如何获取传递给我的perl模块子例程的shell参数:$0$1

我知道我可以定界a;b,以便可以通过perl拆分xarg {}来处理它以获得单个参数),但是我也可以使用perl完全处理所有STDIN。相反,我的目标是使用perl -e,以便我可以显式调用所需的子例程(而不是在脚本中进行一些预处理,以弄清楚要调用的子例程以及要使用的基于STDIN的参数),避免脚本维护费用。

2 个答案:

答案 0 :(得分:3)

虽然bash的自变量可用于$@$0$1$2等,但Perl的自变量可通过{{1}获得}。这意味着Perl等同于

@ARGV

echo a b | xargs -l bash -c 'echo "1:$0 2:$1"'

也就是说,以这种方式使用echo a b | xargs -l perl -e'CORE::say "1:$ARGV[0] 2:$ARGV[1]"' 是没有意义的,因为无法预测它将调用xargs的次数,也无法预测它将调用多少个参数。每次都会传递给perl。您有一个XY Problem,但没有提供任何信息来帮助我们。也许您正在寻找

perl

答案 1 :(得分:2)

我不确定您的设计细节,因此我认为您需要一个Perl线性函数才能使用在其作用域中看到的shell变量。

perl -e'...'执行''下给出的Perl 程序。对于该程序运行环境中的任何变量(管道或Shell脚本)而言,要使它们可用于程序,它们的值都需要传递给它。 this post中详细说明了采用单线执行此操作的方法,以下是摘要。

Perl程序在命令行中以@ARGV数组的形式接收传递给它的参数。因此,您可以在管道中以

调用它
... | perl -e'($v1, $v2) = @ARGV; ...' "$0" "$1"

或为

... | xargs -l perl -e'($v1, $v2) = @ARGV; ...'

如果xargs确实用于向Perl程序提供其输入。在第一个示例中,用引号引起来的变量是为了保护变量中可能有趣的字符(空格,*等),防止它们被设置并运行perl程序的shell解释。

如果输入包含要处理的多行,并且单行代码使用-n-p,则在BEGIN块中解压缩参数

... | perl -ne'BEGIN { ($v1, $v2) = splice(@ARGV,0,2) }; ...'  "$0" "$1" ...

在编译时运行,因此在-n / -p提供的输入行循环之前运行。现在,从@ARGV中删除了文件名以外的参数,因此,如果输入来自文件,则仅保留-n / -p的文件名。

对于通过-s switch进行单行命令行切换,还有一种基本的机制。请查看上面的链接以获取详细信息;我为此建议@ARGV

最后,您的调用代码可以设置环境变量,然后%ENV中的Perl程序可以使用这些变量。但是,这似乎不适合您想要的内容。

另请参见this post