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

xargs pass multiple arguments to perl subroutine?

我知道如何用管道 multiple arguments with xargs:

echo a b | xargs -l bash -c '1:[=10=] 2:'

而且我知道如何将参数数组从 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("[=12=] ")'

只打印:

-e

那么如何将 shell 参数:[=14=]</code> 传递给我的 perl 模块的子例程?</p> <p>我知道我可以分隔 <code>a;b 以便 xarg {} 可以通过 perl 拆分它来处理以获得单独的参数),但我也可以用 perl 完全处理所有 STDIN。相反,我的 objective 是使用 perl -e 以便我可以显式调用我想要的子程序(而不是在脚本中进行一些预处理来确定要调用的子程序和使用的参数在 STDIN 上,以避免脚本维护成本)。

我不确定你的设计细节,所以我认为你需要一个 Perl one-liner 来使用 shell 的变量,这些变量在它被调用的范围内看到.

A perl -e'...' 执行在 '' 下给出的 Perl 程序。对于来自该程序运行环境的任何变量——管道或 shell 脚本——要对程序可用,需要将它们的值传递给它。在 中详细说明了使用 one-liner 执行此操作的方法,这里是摘要。

Perl 程序接收在 @ARGV 数组中的 command-line 上传递给它的参数。所以你可以在管道中调用它作为

... | perl -e'($v1, $v2) = @ARGV; ...' "[=10=]" ""

或作为

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

if xargs 确实用于为 Perl 程序提供输入。在第一个示例中,变量被引用以保护其中可能有趣的字符(空格、* 等)不被设置和运行 perl 程序的 shell 解释。

如果输入包含多行要处理并且 one-liner 使用 -n-p 则在 BEGIN

中解压参数
... | perl -ne'BEGIN { ($v1, $v2) = splice(@ARGV,0,2) }; ...'  "[=12=]" "" ...

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

在 one-liner 中还有一个用于 command-line 开关的基本机制,通过 -s switch。详情请看上面的link;我建议 @ARGV 超过这个。

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

另见 示例。

虽然 bash 的参数可用 $@[=15=]</code>、<code> 等,但 Perl 的参数可通过 @ARGV。这意味着 Perl 相当于

echo a b | xargs -l bash -c 'echo "1:[=10=] 2:"'

echo a b | xargs -l perl -e'CORE::say "1:$ARGV[0] 2:$ARGV[1]"'

也就是说,以这种方式使用 xargs 没有任何意义,因为无法预测它会调用多少次 perl,也无法预测有多少次每次都会传递给 perl 的参数。您有一个 XY Problem,但您没有提供任何信息来帮助我们。也许您正在寻找

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