最近,我有一个 perl 脚本,它使用“do”调用另一个 perl 脚本;IE。
do "./script2.pl $arg1 $arg2";
我的 script2.pl 旨在使用 2 个参数。
但是,以上述方式调用 script2.pl 不会将参数传递给 script2.pl。
我知道还有另一种使用“system”的方法,但是我的script1.pl 需要通过“require”获取一些变量值。
我真的可以使用“do”并将参数传递给我的 script2 吗?
最近,我有一个 perl 脚本,它使用“do”调用另一个 perl 脚本;IE。
do "./script2.pl $arg1 $arg2";
我的 script2.pl 旨在使用 2 个参数。
但是,以上述方式调用 script2.pl 不会将参数传递给 script2.pl。
我知道还有另一种使用“system”的方法,但是我的script1.pl 需要通过“require”获取一些变量值。
我真的可以使用“do”并将参数传递给我的 script2 吗?
如果您正在调用的脚本需要参数,它将在变量中期望它们@ARGV
。如果您使用do
,@ARGV
则调用脚本中的 将在被调用脚本中可见。
{
local @ARGV = ($arg1, $arg2);
do './script2.pl';
}
像这样使用将恢复块末尾的local
旧值,有点像说@ARGV
@ARGV_old = @ARGV;
@ARGV = ($arg1,$arg2);
do './script2.pl';
@ARGV = @ARGV_old;
system()
简短的回答是,如果你想用参数调用另一个脚本,你可能想要使用:
use autodie;
system('./script2.pl', $arg1, $arg2);
# OR if you don't want to install autodie from CPAN
system('./script2.pl', $arg1, $arg2) == 0
or die "cannot run script2.pl: $!";
如果您需要共享解释器,您可能希望以完全不同的方式执行此操作。例如,对于快速脚本,我有时会require
这样使用:
our $SHARED_VALUE = 0;
our $OTHER_VALUE = 42;
require 'script2.pl';
在script2.pl
中,您可以定义:
our ($SHARED_VALUE, $OTHER_VALUE);
当script2.pl
通过 require 加载时,这些变量将被设置。这仍然不是最好的方法。
更好的是,使用包来共享代码,但这会超出问题的范围。
如果你想共享变量,那么它们应该在同一个模块中。否则你在写意大利面条。
如果你想构造你的代码,以便一个文件封装一些功能,那么让它成为一个模块并让“使用模块”包含它。
不,您不能将参数传递给带有do
.
您还可以在主程序中注入您的脚本
eval `cat ./script2.pl`
这样它就可以访问主程序的所有范围变量。