gpt4 book ai didi

perl - 从不同命名空间中所需的文件中调用子例程

转载 作者:行者123 更新时间:2023-12-04 17:00:25 25 4
gpt4 key购买 nike

我正在重构一些旧的、糟糕的 Perl 代码。在很多地方,存储在外部的数据 .pl像这样的文件:

sub data{{ huge => 'datastructure', etc => '...' }};
1;

是这样导入的:
require 'file_with_data.pl';
my $data = data();

我无法更改此数据的存储方式,但我正在移动所有这些 require逻辑到单个包,这将使任何想要它的人都可以访问数据。

我的问题是,我必须逐步执行此操作,即在一段时间内,某些模块将使用旧的、丑陋的方式,而其他一些模块将使用新的、不那么丑陋的方式。

这是我的新包中的方法之一:
sub load_from_subroutine {
no strict 'refs';
my ($self, $file, $subroutine) = @_;
my $data;
try {
if (exists $INC{$file}) {
die "What should I do now?"; # <-- this is what I want to change
}
else {
untaint $file;
require $file;
if (defined &$subroutine) {
$data = &$subroutine;
}
else {
die "Subroutine $subroutine is not defined";
}
}
}
catch {
croak "Unable to load resource from file $file: $_";
};
return $data;
}

万一 exists $INC{$file}测试为真,我可以使用任何技巧来获得 &$subroutine ?这意味着,在这个命名空间中, defined &$subroutine是假的。

临时密码

同时,这就是我正在使用的:
warn "Doing dirty trick in order to be able to load $file!\n";
my $tmp = '/tmp/data' . time . rand(100) . '.pl';
copy $file, $tmp;
require $tmp;
# do the loading stuff as shown...
unlink $tmp;

这真的很糟糕,我渴望更好的解决方案。

最佳答案

它没有加载到不同的命名空间中(注意缺少 package )。缺少package也意味着你应该使用 do而不是 require . do忽略 %INC .

关于perl - 从不同命名空间中所需的文件中调用子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23721773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com