当隐式打开失败时需要perl死亡

bas*_*sin 5 linux perl

我正在尝试将sed脚本迁移到perl单行代码,因为perl支持非贪婪的正则表达式。我是否已从sed中的非贪婪(勉强)正则表达式匹配中获取建议为什么我的Perl就地脚本,即使它没有一个零退出代码退出?

如果打开文件失败,我需要oneliner以非零状态退出。

不幸的是,检查-f $ARGV[0]是不可靠的,因为该文件可能存在并且仍然无法访问。

一种想法是在命令行的所有文件之间添加一些perl代码来执行,但是我找不到一个。END执行一次,如果最后一个文件成功执行,则不会知道先前的文件失败。

touch aaa.txt
chmod 000 aaa.txt
perl -i -pe 'BEGIN { -f $ARGV[0] or die "fatal: " . $!; }' aaa.txt; echo $?
Run Code Online (Sandbox Code Playgroud)

_

Can't open aaa.txt: Permission denied.
0
Run Code Online (Sandbox Code Playgroud)

JGN*_*GNI 7

Can't open ...文本是一个警告。您可以使用$SIG{__WARN__}信号处理程序来捕获它。

由于您应该得到的唯一警告是来自开关<>提供的循环中的隐式运算符,因此-p您可以像这样重写代码

perl -i -pe 'BEGIN { $exit = 0; $SIG{__WARN__} = sub { $exit = 1; warn @_} } END { $? = $exit}' aaa.txt; echo $?
Run Code Online (Sandbox Code Playgroud)

$exit在脚本开始时将其设置为0,如果有警告,则将其设置为1。所述END块受让人的值$exit,以$?这将是脚本的退出代码一旦结束。