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


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

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

Answers:


6

-p开关只是为了在这个循环中包装你的代码(参数如下-e)的快捷方式:

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

(-n相同,但没有继续块。)

<>空的操作等同于readline *ARGV,而且在继承开始后的每个参数作为一个文件进行读操作。没有办法影响该隐式打开的错误处理,但是您可以使警告发出致命的警告(请注意,这还会影响与-i开关有关的若干警告):

perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok

@MarkReed inplace是我们感兴趣的警告类别。没有理由影响其他警告。
Grinnz '19

来自警告The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
Grinnz '19

对,inplace是类别;没有它,-Mwarnings=FATAL意味着FATAL => all我们不想要的。得到它了。
马克·里德

4

在循环的主体中设置一个标志,在oneliner末尾的END块中检查该标志。

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}'

1
如果您的脚本应该将文件作为参数而不是从stdin读取,则该解决方案的替代方案是BEGIN{die "File not found" unless -f $ARGV[0]}。(我说轻一点,因为它不涉及设置标志和添加2条代码)
Dada

还假定所有文件的长度都不为零。
Tanktalus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.