在tchrists broilerplate中,我发现在END块中明确关闭了STDOUT.
END { close STDOUT }
Run Code Online (Sandbox Code Playgroud)
我知道结束并关闭,但我想知道为什么需要它.
当开始搜索它时,在perlfaq8中找到以下内容:
例如,您可以使用它来确保您的过滤器程序设法完成其输出而不填满磁盘:
END {
close(STDOUT) || die "stdout close failed: $!";
}
Run Code Online (Sandbox Code Playgroud)
并且无论如何也不理解.:(
有人可以解释(可能有一些代码示例):
Mat*_*Mat 15
许多系统实现"乐观"文件操作.我的意思是,print在数据实际写入文件之前,或者甚至在磁盘上保留足够的空间以使写入成功之前,对文件添加一些数据的调用可以成功返回.
在这些情况下,如果磁盘几乎已满,则所有打印都可以显示成功,但是当需要关闭文件并将其刷新到磁盘时,系统会意识到没有剩余空间.然后关闭文件时出错.
此错误意味着您认为保存的所有输出实际上可能根本没有保存(或部分保存).如果这很重要,您的程序需要报告错误(或尝试纠正这种情况,或者......).
所有这些都可以在STDOUT文件句柄上发生,如果它连接到文件,例如,如果您的脚本运行如下:
perl script.pl > output.txt
Run Code Online (Sandbox Code Playgroud)
如果您输出的数据很重要,并且您需要知道所有数据是否确实写得正确,那么您可以使用您引用的语句来检测问题.例如,在第二个代码段中,die如果close报告错误,脚本会显式调用; tchrist的样板运行在use autodie,die如果close失败则会自动调用.
(这不能保证数据永久存储在磁盘上,其他因素也会在那里发挥作用,但这是一个很好的错误指示.即如果关闭失败,你知道你有问题.)