gpt4 book ai didi

perl - 你什么时候需要在 Perl 中设置 `END { close STDOUT}`?

转载 作者:行者123 更新时间:2023-12-03 20:28:06 25 4
gpt4 key购买 nike

tchrists broilerplate我在 END 块中发现了 STDOUT 的显式关闭。

END { close STDOUT }

我知道 END 并关闭,但我不知道为什么需要它。

开始搜索的时候,发现在 perlfaq8下列:

For example, you can use this to make sure your filter program managed to finish its output without filling up the disk:


END {
close(STDOUT) || die "stdout close failed: $!";
}

反正不明白。 :(

有人可以解释一下(也许有一些代码示例):
  • 为什么以及何时需要
  • 我的 perl 过滤器如何以及在什么情况下可以填满磁盘等等。
  • 如果没有它,事情就会出错...
  • 等等??
  • 最佳答案

    许多系统实现了“乐观”的文件操作。我的意思是,例如调用 print 这应该向文件添加一些数据可以在数据实际写入文件之前成功返回,或者甚至在磁盘上保留足够的空间以成功写入之前。

    在这些情况下,如果您的磁盘几乎已满,那么您的所有打印似乎都成功了,但是当需要关闭文件并将其刷新到磁盘时,系统会意识到没有剩余空间了。然后在关闭文件时出现错误。

    此错误意味着您认为保存的所有输出实际上可能根本没有保存(或部分保存)。如果这很重要,您的程序需要报告错误(或尝试纠正这种情况,或者……)。

    所有这一切都可能发生在 STDOUT文件句柄,如果它连接到一个文件,例如如果您的脚本运行为:

    perl script.pl > output.txt

    如果您输出的数据很重要,并且您需要知道所有这些数据是否确实写入正确,那么您可以使用您引用的语句来检测问题。例如,在您的第二个代码段中,脚本显式调用 die如果 close报告错误; tchrist's boilerplateuse autodie 下运行,它会自动调用 die如果 close失败。

    (虽然这并不能保证数据永久存储在磁盘上,其他因素也会在那里起作用,但这是一个很好的错误指示。即如果关闭失败,你就知道你有问题。)

    关于perl - 你什么时候需要在 Perl 中设置 `END { close STDOUT}`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321365/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com