我知道如何管道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的参数),避免脚本维护费用。
答案 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。