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中,而不是我想要的内容.目标范围已创建,但未填充 我正在使用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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |