Answers:
该-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
The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
inplace
是类别;没有它,-Mwarnings=FATAL
意味着FATAL => all
我们不想要的。得到它了。
在循环的主体中设置一个标志,在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}'
BEGIN{die "File not found" unless -f $ARGV[0]}
。(我说轻一点,因为它不涉及设置标志和添加2条代码)