需要 Perl 在隐式打开失败时死亡

  • 本文关键字:失败 Perl 需要 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 $?

_

Can't open aaa.txt: Permission denied.
0

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

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

perl -i -pe 'BEGIN { $exit = 0; $SIG{__WARN__} = sub { $exit = 1; warn @_} } END { $? = $exit}' aaa.txt; echo $?

这会在脚本开始时将$exit设置为 0,如果出现警告,则将其设置为 1。END块将$exit的值分配给$?该值在脚本结束后将成为脚本的退出代码。

最新更新