当找不到输入文件时,如何最好地(习惯地)使perl脚本失败(使用-n/-p运行)?

当找不到输入文件时,如何最好地(习惯地)使perl脚本失败(使用-n/-p运行)?,perl,Perl,我真的希望perl脚本在文件不存在时失败。当输入文件不存在时,使-p或-n失败的“正确”方法是什么?只是在这个循环中包装代码的快捷方式(在-e后面的参数): $ perl -pe 1 foo && echo ok Can't open foo: No such file or directory. ok 在循环体中设置一个标志,在一行程序末尾的结束块中检查该标志 perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok

我真的希望perl脚本在文件不存在时失败。当输入文件不存在时,使-p或-n失败的“正确”方法是什么?

只是在这个循环中包装代码的快捷方式(在-e后面的参数):

$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok

在循环体中设置一个标志,在一行程序末尾的结束块中检查该标志

perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok
请注意,它仅在未处理任何文件时失败

若要在未找到所有文件时报告问题,可以使用以下命令

perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2

如果您的脚本应该将文件作为参数而不是从stdin读取,那么此解决方案的一个更简单的替代方案是
BEGIN{die“File not found”,除非-f$ARGV[0]}
。(我说打火机,因为它不涉及设置标志和添加两段代码)还假设所有文件的长度都不是零。@MarkReed inplace是我们感兴趣的警告类别。没有理由影响其他警告。From:
类别列表中出现“致命”一词会将这些类别中的警告升级为该词法范围内的致命错误。
右侧,
inplace
为类别;没有它,
-Mwarnings=FATAL
意味着
FATAL=>所有的
,这是我们不想要的。知道了。
perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2
perl -pe 'BEGIN{ $files = @ARGV} $found++ if eof; ... ;END {die "Some files not found" unless $files == $found}'