我正在学习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; } }
我不明白为什么他们在谈论编译配置文件? 它是什么样的配置文件?我们为何/何时使用该配置文件?
由于
答案 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 ~`
将是一个令人讨厌的惊喜。
有许多更好的配置格式:
如果确实如此,您可以使用JSON或XML。所有这些格式都具有以下优点:它们只是数据而不是代码。因此它们是安全的(假设解析器没有错误)。