在perl5中,我曾经用'do(file)'来配置这样的配置文件:
---script.pl start --- our @conf = (); do '/path/some_conf_file'; ... foreach $item (@conf) { $item->{rules} ... ... ---script.pl end --- ---/path/some_conf_file start --- # arbitrary code to 'fill' @conf @conf = ( {name => 'gateway', rules => [ {verdict => 'allow', srcnet => 'gw', dstnet => 'lan2'} ] }, {name => 'lan <-> lan2', rules => [ {srcnet => 'lan', dstnet => 'lan2', verdict => 'allow', dstip => '192.168.5.0/24'} ] }, ); ---/path/some_conf_file end ---
Larry Wall的"Programming Perl"也提到了这种方法:
但是FILE对读取程序配置文件等内容仍然有用.手动错误检查可以这样做:
# read in config files: system first, then user for $file ("/usr/share/proggie/defaults.rc", "$ENV{HOME}/.someprogrc") { unless ($return = do $file) { warn "couldn't parse $file: $@" if $@; warn "couldn't do $file: $!" unless defined $return; warn "couldn't run $file" unless $return; } }
好处:
每次都不需要编写自己的解析器 - perl解析并为您创建数据结构;
更快/更简单:本机perl数据结构/类型,没有从外部格式转换的开销(如YAML);
与模块作为conf文件相比,不需要操纵@INC从某处加载模块;
与作为conf文件的模块相比,额外的代码更少;
"配置文件"的"语法"与perl本身一样强大;
"临时"格式;
缺点:
没有隔离:我们可以从"配置文件"执行/销毁任何东西;
如何使用perl6获得相同的效果?
有没有办法在perl6中做得更好(没有缺点)并且没有解析自己的语法,语法,模块包括?
像"从文件中的文本表示加载哈希值或数组"之类的东西?