【问题标题】:Why does perl's autodie feature not include "print"? (And is there a workaround?)为什么 perl 的 autodie 功能不包括“打印”? (有没有解决方法?)
【发布时间】:2015-02-14 19:45:47
【问题描述】:

稍微看了一下另一个问题(Print or die: how to check if a GPFS network mounted file is availableautodie 是一个非常有用的编译指示,因为它会发出各种可能致命的调用,实际上是致命的。

open 之类的东西 - 写成 open or die 很常见。

但是autodie的问题是:

打印

autodie pragma 不检查打印调用。

你不能强迫它:

Cannot make the non-overridable builtin print fatal

没有编写我自己的“print_or_die”子程序,有没有办法复制类似于autodie pragma 的东西,它也会捕获print 返回码?

(对于可能相关的场景 - 请参阅上面的链接。写入时 NFS 软安装错误,它们不会阻塞)

【问题讨论】:

  • 我只想补充一个问题,如果 print() 中的一些在此之前失败,close() 是否可以成功。
  • 问题是 print 操作符有一个 subs 无法复制的语法。这是可能的,但要困难得多。
  • 我认为关闭可以在打印失败的情况下成功 - 除了我链接的示例之外,我认为“磁盘已满”将允许您打开/关闭零长度文件,但不能成功打印到它。或者可能只是犯了一个错误,然后打开一个文件进行读取而不是写入。
  • 我不太确定你的磁盘示例
  • 使用use autodie; open my $fh, ">", "/dev/full"; select $h; $|=1; print "x" or warn "print failed with $! (".($!+0).")"; close $fh 进行测试,打印和关闭都失败(使用缓冲,只是关闭失败)

标签: perl


【解决方案1】:

在我看来,你自己有答案:

因为它 [autodie] 会发出各种各样的调用,这些调用可能应该是 致命的,实际上是致命的。

print 据我了解,大多数情况下不应该是致命的,所以你提供的解决方法print_or_die 似乎也是解决方案。

【讨论】:

  • 我的问题是 - 如果我希望文件 IO 'bomb out' - 我希望它适用于所有内容 - 打开、打印、关闭。尽管打开/关闭工作,打印 can 失败。 (磁盘已满、安装损坏等)。因此,如果您这样做,您应该 测试打印以避免文件损坏。 (或者至少,您可以判断您是否成功“编写”了您的输出)。
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2014-05-27
相关资源
最近更新 更多