检查文件是否存在并且在@INC 中以要求

问题描述 投票:0回答:1

我正在编写一个脚本,它将接受用户的输入以加载配置/数据文件。

我的第一个想法是(假设文件名在

$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

file perl
1个回答
0
投票

您的代码不会产生您所说的消息,但

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 的更改导致它停止工作。

© www.soinside.com 2019 - 2024. All rights reserved.