加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

include / eval perl文件到运行时定义的唯一命名空间

发布时间:2020-12-16 06:23:45 所属栏目:大数据 来源:网络整理
导读:我正在编写一个必须导入许多其他perl配置文件的工具.这些文件没有包装,可能有相似或相互矛盾的变量/功能.我没有能力改变这些文件的格式,所以我必须解决它们的问题.我想要做的是将每个导入到一个唯一的名称空间,但我没有找到使用do,require或use来做到这一点
我正在编写一个必须导入许多其他perl配置文件的工具.这些文件没有包装,可能有相似或相互矛盾的变量/功能.我没有能力改变这些文件的格式,所以我必须解决它们的问题.我想要做的是将每个导入到一个唯一的名称空间,但我没有找到使用do,require或use来做到这一点的方法.如果我不使用动态名称,只使用硬编码名称,我就可以做到.

想要这样的东西:

sub sourceTheFile {
  my ($namespace,$file) = @_;
  package $namespace;
  do $file;
  1;
  return;
}

这不起作用,因为package命令需要名称的常量.那么我尝试这样的事情:

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

但是do do读取的文件内容放在main :: scope中,而不是我想要的内容.目标范围已创建,但未填充
做. (我试过要求,并且在eval中只有一个直的cat $文件.)

我正在使用Devel :: Symdump来验证命名空间是否正确构建.

示例输入文件:

my $xyz = "some var";
%all_have_this = ( common=>"stuff" );

额外挑战

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

解决方法

我不确定为什么eval不起作用.也许是个bug?这是使用临时文件的变通方法.这对我有用:

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读