Xargs将多个参数传递给Perl子例程



我知道如何用XARGS进行多个参数:

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

我知道如何将一系列参数传递给我的perl模块的子例程:

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

,但我似乎无法使用这些美元参考(以满足me::someSub签名(来获得多个个人参数:

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

只打印:

-e

那么如何获得外壳参数: $0$1传递给我的perl模块的子例程?

我知道我可以只界定 a;b,以便可以通过将其拆分以获取单个参数来处理XARG {}(,但我也可以完全用Perl完全处理所有Stdin。取而代之的是,我的目标是使用perl -e,以便我可以明确调用我想要的子例程(而不是在脚本中有一些预处理,以弄清楚要拨打什么子例程以及基于stdin使用哪些论点,以避免脚本维护成本(。

,而bash的参数可作为$@$0$1$2等获得,而Perl的参数可通过@ARGV获得。这意味着

的perl等效
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的次数,并且无法预测每次perl的参数将传递多少参数。您有一个XY问题,并且还没有提供任何信息来帮助我们。也许您正在寻找

perl -e'CORE::say "1:$ARGV[0] 2:$ARGV[1]"' $( echo a b )

我不确定您的设计详细信息,因此我认为您需要一个perl One-Liner来使用shell的变量,这些变量被称为。<<<<<<<<<</p>

A perl -e'...'执行''给出的Perl 程序。对于来自该程序运行的环境的任何变量(管道或外壳脚本(,可以将其值传递给程序。在这篇文章中阐明了用单线执行此操作的方法,这是一个摘要。

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

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

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

如果xargs确实用于为其输入提供Perl程序。在第一个示例中,引用了变量,以保护其中可能的有趣字符(空格, *等(免受设置并运行perl程序的外壳解释。

如果输入包含多行处理,并且单线使用-n-p,则在BEGIN块中解开参数

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

在编译时间运行的

,因此在循环之前,-n/-p提供的输入线。现在,文件名之外的其他参数已从@ARGV中删除,因此,如果输入来自文件,则仅将文件名留在-n/-p中。

通过-s开关,还有一种单线命令行开关的基本机制。请参阅上面的链接以获取详细信息;我会推荐@ARGV

最后,您的调用代码可以设置环境变量,然后可以在%ENV中使用Perl Progam。但是,这似乎不适合您似乎想要的东西。

还请参见此帖子。

最新更新