我正在修改一个Perl程序,我想要一个可以运行程序原始版本的测试工具(称之为launch_rockets.pl
)并收集标准输出,但不知何故跳过system
调用发生在launch_rockets.pl
内。以下代码成功覆盖system
内的launch_rockets.pl
:
use subs qw(system);
my $SYSTEM_SUCCESS = 0;
sub system {
print "***\n";
print "system @_\n";
print "***\n\n";
return $SYSTEM_SUCCESS;
}
local @ARGV = @test_args;
do 'launch_rockets.pl';
到目前为止一切顺利。但launch_rockets.pl
也包含
use Proc::Background;
以后
Proc::Background->new('perl', 'launch_missiles.pl');
我可以将launch_rockets.pl
复制到沙箱中,其中Proc::Background
被存根替换,但我想知道是否有任何覆盖策略在do FILE
调用中有效文件的原始环境。
答案 0 :(得分:7)
use lib '/my/test/library/path';
lib将目录添加到@INC
,因此/my/test/library/path/Proc/Background.pm
将成为加载的文件。把你想要的任何代码放在那里。
另一种选择是:
{
package Proc::Background;
... # Put stub code here
} # end of package Proc::Background
$INC{'Proc/Background.pm'} = 1; # Make Perl think Proc::Background is loaded