子程序通过'do'调用另一个Perl脚本重新定义了错误

时间:2013-08-19 15:27:53

标签: perl debugging

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

我正在尝试从另一个Perl脚本调用Perl脚本。我正在实现这个目标的方式如下:

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

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

使用'do'而不是'system()'可以更容易地使用'-d'标志进行调试,并避免不必要的系统调用。我遇到的问题是,如果多次调用相同的perl脚本,'do'将失败,因为Perl脚本中定义了子例程,并且不止一次调用脚本会给我带来'subroutine redefined'错误。< / p>

除了'do'还是某种忽略重新定义的子程序的方法之外,还有另一种方法吗?

2 个答案:

答案 0 :(得分:2)

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

{
    no warnings 'redefine';
    local @ARGV = (
       $arg1,
       $arg2
    );
    do 'perl_script.pl';
}

答案 1 :(得分:0)

如果您在编辑正在调用的文件时遇到问题,那么快速的某种方法就是为每个脚本定义不同的命名空间:

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

... # some code

sub some_sub {
    ...
}

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

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

HTH