我正在编写一个必须导入许多其他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似乎没有能力从字符串构建变量名称并将其用作变量.