您何时需要在Perl中使用“ END {close STDOUT}”?

问题描述

| 在tchrists烤盘中,我在END块中发现了STDOUT的这种明显关闭。
END { close STDOUT }
我知道END并关闭,但是我不知道为什么需要它。 当开始搜索它时,在perlfaq8中找到以下内容:   例如,您可以使用它来   确保您的过滤器程序能够   完成其输出而不填满   磁盘:
END {
    close(STDOUT) || die \"stdout close failed: $!\";
}
而且还是不明白。 :( 有人可以解释一下(也许有一些代码示例): 为什么和何时需要 我的perl过滤器如何以及在什么情况下可以填满磁盘等等。 如果没有它,事情就会出错... 等等??     

解决方法

        许多系统实现“乐观”文件操作。我的意思是,对“ actually2”的调用应该向文件中添加一些数据,可以在数据实际写入文件之前,甚至在磁盘上保留足够的空间以使写入成功之前成功返回。 在这些情况下,如果磁盘快满了,则所有打印都可以成功显示,但是当需要关闭文件并将其刷新到磁盘上时,系统会意识到没有空间了。关闭文件后,您将收到错误消息。 此错误意味着您认为保存的所有输出实际上可能根本没有保存(或部分保存)。如果那很重要,则您的程序需要报告错误(或尝试纠正这种情况,或...)。 如果连接到文件,例如.3ѭ文件句柄,所有这一切都可能发生。如果您的脚本运行为:
perl script.pl > output.txt
如果您输出的数据很重要,并且您需要知道所有数据是否确实正确编写,那么可以使用引用的语句来检测问题。例如,在第二个代码段中,如果
close
报告错误,脚本将显式调用
die
;否则,脚本将调用
die
。 tchrist的样板文件在
use autodie
下运行,如果
close
失败,它将自动调用
die
。 (尽管这不能保证数据永久存储在磁盘上,其他因素也会在其中起作用,但这是一个很好的错误指示。即,如果关闭失败,则说明您有问题。)     ,        我相信Mat是错误的。 Perl和系统都具有缓冲区。
close
使Perl \的缓冲区刷新到系统。它并不一定会导致Mat声称将系统的缓冲区写入磁盘。那就是ѭ11所做的。 现在,无论如何在退出时都会发生这种情况,但是调用
close
可以使您有机会处理刷新缓冲区时遇到的任何错误。
close
做的另一件事是报告系统尝试将其缓冲区刷新到磁盘的尝试中的较早错误。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...