文件处理程序在输出到Perl

时间:2015-09-21 02:25:04

标签: perl perl-module mod-perl

我有perl脚本,我已经为其创建了一个日志文件,此脚本将执行的所有操作都将写入日志文件中。

它工作正常,我做了一些修改来解决一些问题,但现在我遇到了一个奇怪的问题,文件处理程序在写日志文件时遇到困难,并且它没有更新日志文件,除非我是使用exit(x)选项退出脚本。

例如,我的脚本提供执行

  1. 提取
  2. 验证
  3. 备份

    X。退出

  4. 现在我正在运行Extraction并正在更新日志。但是当extrcation完成后我打开了日志文件,我可以看到最后一行,如

    Date: XYZ file extracted.    
    Date: XXXX file is preparing to extract
    Date:
    

    并没有进一步更新,虽然它已经提取了所有文件,然后我使用X选项退出脚本,只有在那之后我才能看到完整的日志。

    我不明白为什么它会被卡住,所有其他选项也会发生这种情况。以前它工作正常。我只是使用文件处理程序和print来重定向它。

    open FILE, ">>log.txt" 
    
    ## DO some thing
    
    print FILE $output;
    

    有人可以告诉我可能是什么问题吗?

1 个答案:

答案 0 :(得分:0)

您遇到了file buffering。这是大多数编程语言的正常做法。由于写入磁盘或终端的速度很慢,因此每个print语句不一定立即写入。输出通常存储在内存中(即“缓冲”),并在达到一定数量或特定字符时写入。

默认情况下,STDERR未缓冲。终端STDOUT通常是行缓冲的,这意味着它会在看到换行符时写入。文件以块为单位进行缓冲,通常为4K或8K,具体取决于您的系统。

对于日志文件,关闭此缓冲是有意义的。所有文件句柄都响应IO :: Handle方法,因此请使用IO::Handle方法autoflush执行此操作。

# Because you've forgotten to check if the file opened.
use autodie;

open my $fh, ">>", $log_file;
$fh->autoflush(1);