我可以将 @ARGV 和选项传递给通过 do 调用的 perl 脚本吗?

Can I pass @ARGV and options to a perl script invoked via do?

我有一个脚本可以处理 @ARGV 和选项(通过 Getopt::Long::Descriptive)。

现在,我还想从另一个 perl 程序调用同一个脚本,并将变量传递给它。

一种解决方案是使用 system,并构建相应传递的参数,如下所示:

system("perl my_script.pl", qw/--foo bar --baz 2/);

我的问题是:我可以通过 do 调用脚本获得相同的结果吗?

我正在尝试这样做,因为脚本会 运行 在 Minion 作业队列中,所以我会避免每次都产生 perl 实例 - 这通常会导致内存不足问题。

您可以自己设置@ARGV,然后评估脚本文件。

这会起作用

@ARGV = qw(--foo --bar).
do $script_file;

因为 @ARGV 是一个全局变量,它在 do 中也可用。但是如果你想访问你定义的任何局部变量,那么你可以使用:

eval `cat $script_file`;

编辑:我错误地认为 @ARGVdo 内无法访问。

rajashekar 的回答是正确的,但我还要补充一点,您可以在 local 块中为子脚本设置 args,这样子脚本就不需要破坏父脚本中的 @ARGV

{
    local @ARGV = ("--foo","bar","--baz",$ARGV[3]);
    do 'my_script.pl';
}
# previous @ARGV restored at end of block