2

最近,我有一个 perl 脚本,它使用“do”调用另一个 perl 脚本;IE。

do "./script2.pl $arg1 $arg2";

我的 script2.pl 旨在使用 2 个参数。

但是,以上述方式调用 script2.pl 不会将参数传递给 script2.pl。

我知道还有另一种使用“system”的方法,但是我的script1.pl 需要通过“require”获取一些变量值。

我真的可以使用“do”并将参数传递给我的 script2 吗?

4

5 回答 5

13

如果您正在调用的脚本需要参数,它将在变量中期望它们@ARGV。如果您使用do@ARGV则调用脚本中的 将在被调用脚本中可见。

{
    local @ARGV = ($arg1, $arg2);
    do './script2.pl';
}

像这样使用将恢复块末尾的local旧值,有点像说@ARGV

@ARGV_old = @ARGV;
@ARGV = ($arg1,$arg2);
do './script2.pl';
@ARGV = @ARGV_old;
于 2012-06-24T05:07:03.307 回答
4

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 加载时,这些变量将被设置。这仍然不是最好的方法。

更好的是,使用包来共享代码,但这会超出问题的范围。

于 2012-06-24T02:28:50.883 回答
1

如果你想共享变量,那么它们应该在同一个模块中。否则你在写意大利面条。

如果你想构造你的代码,以便一个文件封装一些功能,那么让它成为一个模块并让“使用模块”包含它。

于 2012-06-24T02:10:53.220 回答
0

不,您不能将参数传递给带有do.

于 2012-06-24T02:16:00.147 回答
0

您还可以在主程序中注入您的脚本

 eval `cat ./script2.pl`

这样它就可以访问主程序的所有范围变量。

于 2017-10-28T15:26:16.680 回答