我如何模拟内置`require`函数?

ern*_*nix 2 perl refactoring mocking require

我要重构大量旧的perl脚本.(超过150k行,没有测试,没有严格,没有包,没有提交日志,没有评论)

当我开始在t目录下编写一些测试时.我发现几乎所有文件require都是绝对路径.所以我尝试模拟内置require函数使它们可移植,但没有运气:

吨/ 001-require.t

use strict;
use warnings;
use Test::More;
use FindBin;

BEGIN {
    my $root = "$FindBin::RealBin/../";
    sub require {
        $_[0] = $root . $_[0];
        CORE::require(@_);
    }
}

require_ok "foo.pl";

done_testing();
Run Code Online (Sandbox Code Playgroud)

上面的脚本给了我: Error: Can't locate foo.pl in @INC...

如何在Perl需要之前添加根路径?

更新

谢谢Axeman,我使用以下钩子修改了绝对路径.

my $root = "$RealBin/../";
unshift @INC, sub {
    my ($coderef, $filename) = @_;
    $filename =~ s/^\///;
    open(FILE, '<', $root . $filename);
    return *FILE;
};
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

你不是在寻找

use FindBin qw( $RealBin );
use lib "$RealBin/..";
Run Code Online (Sandbox Code Playgroud)