我正在编写一个脚本,它将接受用户的输入以加载配置/数据文件。
我的第一个想法是(假设文件名在
$file
中):
if (-e $file) {
my $data = require $file;
die "Failed to parse data\n" if $@;
} else {
die "File does not exist\n";
}
这在一定程度上是有效的——如果文件不存在,它就会相应地消失。但是,如果是这样,并且不是完整路径(以
/
开头)而是相对于当前目录,则它会终止并显示来自 Perl 的消息:
[…]'。'不再属于@INC;你的意思是做[…]
这是为什么呢?我不想将
.
添加到 @INC
,但令我惊讶的是,这并没有随着我的消息而消失。难道不应该只是满足要求并设置$@
吗?
如何测试文件是否存在并且位于
@INC
范围内?或者,也许还有另一种解决方案,例如可靠地测试当前目录中的路径并使其成为完整路径,然后再传递给require
。
您的代码不会产生您所说的消息,但
do EXPR
可以产生该警告。
$ touch foo # The file must exist for the warning to be produced.
$ perl -e'do "foo"'
do "foo" failed, '.' is no longer in @INC; did you mean do "./foo"? at -e line 1.
它发出警告的原因是因为它曾经“工作”(只要当前工作目录恰好是脚本的目录),但是对 Perl 的更改导致它停止工作。