将include / eval perl文件放入运行时定义的唯一名称空间

Bru*_*uce 5 perl

我正在写一个必须导入许多其他perl配置文件的工具。这些文件不带有包装,并且可能具有相似或冲突的变量/功能。我没有能力更改这些文件的格式,因此我必须解决它们的问题。我当时想做的就是将每个导入一个唯一的名称空间,但是我还没有找到一种使用,或来实现此目的的方法dorequireuse。如果我不使用动态名称,而只是使用硬编码名称,那么我可以做到。

想要这样的事情:

sub sourceTheFile {
  my ($namespace, $file) = @_;
  package $namespace;
  do $file;
  1;
  return;
}
Run Code Online (Sandbox Code Playgroud)

那是行不通的,因为package命令需要一个常量作为名称。所以我尝试这样的事情:

sub sourceTheFile {
  my ($namespace, $file) = @_;
  eval "package $namespace;do $file;1;"
  return;
}
Run Code Online (Sandbox Code Playgroud)

但是读取的文件的内容位于我想要domain::范围之外。目标范围已创建,只是没有填充 do。(我尝试过require,并且cat $file在评估内也只是笔直。)

Devel::Symdump用来验证名称空间是否正确构建。

输入文件示例:

my $xyz = "some var";
%all_have_this = ( common=>"stuff" );
Run Code Online (Sandbox Code Playgroud)

其他挑战

使用执行临时文件构建和调用的答案,我可以根据需要动态地进行此工作。但是,很大,但是现在我该如何引用这个新名称空间中的数据?Perl似乎不具备从字符串构建变量名并将其用作变量的能力。

Håk*_*and 3

我不知道为什么eval不起作用。也许是一个错误?这是使用临时文件的解决方法。这对我有用:

use strict;
use warnings;

use Devel::Symdump;
use File::Temp;

my $file = './test.pl';
my $namespace = 'TEST';
{
    my $fh = File::Temp->new();
    print $fh "package $namespace;\n";
    print $fh "do '$file';\n";
    print $fh "1;\n";
    close $fh;
    do $fh->filename;
}
Run Code Online (Sandbox Code Playgroud)