0

如何在 Perl 脚本上使用“do”并避免多个子例程定义?

我正在尝试从另一个 Perl 脚本调用 Perl 脚本。我完成此操作的方式如下:

 local @ARGV = (
   $arg1,
   $arg2
 );
 do 'perl_script.pl';

我使用 'do' 而不是使用 'system()' 的原因是这个旧代码库涉及调用多个 Perl 脚本,这些脚本又调用多个 Perl 脚本(现在我当然可以将所有内容重构为 Perl 模块,但那不是在这一点上值得)。

使用 'do' 而不是 'system()' 可以更轻松地使用 '-d' 标志进行调试,并避免不必要的系统调用。我遇到的问题是,如果多次调用相同的 perl 脚本,“do”将失败,因为 Perl 脚本中定义了子例程,并且多次调用脚本会给我留下“子例程重新定义”错误。

除了“做”或某种忽略重新定义的子例程的方法之外,还有其他方法可以做到这一点吗?

4

2 回答 2

2

听起来你知道这是一个丑陋的设置,所以我将跳过深入探讨它。您可以在运行块中使用范围无警告:

{
    no warnings 'redefine';
    local @ARGV = (
       $arg1,
       $arg2
    );
    do 'perl_script.pl';
}
于 2013-08-19T15:37:53.043 回答
0

如果您在编辑您正在调用的文件时没有问题,那么一个快速的某种肮脏的解决方案可能是为每个脚本定义不同的命名空间:

package script1; # From this point, the current namespace is script1
use warnings;
use strict;

... # some code

sub some_sub {
    ...
}

这样,如果另一个脚本定义了some_sub,它不会被视为重新定义,因为它位于不同的命名空间中。这也可以防止脚本使用全局变量或其他可能导致意外结果的定义来污染其余脚本的执行。

同样,这远非最佳或良好实践(不是定义命名空间的事实,而是任意定义它们只是为了快速隔离事物,因为您可能会复制可以在有组织的方案中重用的代码)。这只是一个可以帮助您快速完成这项工作的想法。

高温高压

于 2014-06-09T18:50:48.503 回答