需要解释在Perl中读取“config”文件

时间:2014-01-23 23:03:43

标签: perl file config

我正在学习Perl。

我在文件上看到了一个使用“do”函数的脚本。然后我读到了关于该功能的内容:

  

如果可以读取文件但无法编译,则返回undef和   在$ @中设置错误消息。如果无法读取文件,则返回   undef并设置$!错误。始终先检查$ @作为编译   可能以一种同样设置$的方式失败! 。如果文件成功   编译后,do返回最后一个表达式的值。

     

最好使用use和require来包含库模块   运营商,也进行自动错误检查和提高   如果出现问题则例外。

     

您可能希望使用do来读取程序配置文件。   手动错误检查可以这样做:   您可能希望使用do来读取程序配置文件。   手动错误检查可以这样做:

# read in config files: system first, then user 
for $file ("/share/prog/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;
    }
}

我不明白为什么他们在谈论编译配置文件? 它是什么样的配置文件?我们为何/何时使用该配置文件?

由于

1 个答案:

答案 0 :(得分:8)

有时,使用脚本代替配置文件。然后,这可以设置全局状态,或返回一些值。例如:

myprogrc

{
  foo => "bar",
  baz => 42,
}

用法:

my $file = "myprogrc";
if (my $config = do $file) {
   # do something with the config values
   print "config values were $config->{foo} and $config->{baz}\n";
}
else {
    warn "couldn't parse $file: $@" if $@;
    warn "couldn't do $file: $!"    unless defined $config;
    warn "couldn't run $file"       unless $config;
}

不要这样做。因为配置文件只是Perl代码,所以它可以执行任意内容 - 危险!例如。 `rm -rf ~`将是一个令人讨厌的惊喜。

有许多更好的配置格式:

  • YAML
  • INI格式,无穷无尽的变体

如果确实如此,您可以使用JSON或XML。所有这些格式都具有以下优点:它们只是数据而不是代码。因此它们是安全的(假设解析器没有错误)。