我可以将 @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`;
编辑:我错误地认为 @ARGV
在 do
内无法访问。
rajashekar 的回答是正确的,但我还要补充一点,您可以在 local
块中为子脚本设置 args,这样子脚本就不需要破坏父脚本中的 @ARGV
。
{
local @ARGV = ("--foo","bar","--baz",$ARGV[3]);
do 'my_script.pl';
}
# previous @ARGV restored at end of block
我有一个脚本可以处理 @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`;
编辑:我错误地认为 @ARGV
在 do
内无法访问。
rajashekar 的回答是正确的,但我还要补充一点,您可以在 local
块中为子脚本设置 args,这样子脚本就不需要破坏父脚本中的 @ARGV
。
{
local @ARGV = ("--foo","bar","--baz",$ARGV[3]);
do 'my_script.pl';
}
# previous @ARGV restored at end of block