是Perl的$ |选择合适的缓冲区?

时间:2013-10-16 16:24:54

标签: perl buffer

我正在尝试快速更改文件大小并遇到文件从未使其大小合适的问题。下面的代码是否像我认为的那样运行?主要是$|运算符实际选择$fh还是选择STDOUT

# Open file, hot buffer
open(my $fh, '>>', $file_path) ||
   die 'Could not open temp file: '.$!;
$| = TRUE;

# Make file longer (div 2 because 
# we print 2 at a time)
print $fh "\r\n" x ($diff / 2);

# Wait for file system to catch
# up, then close file.
sleep 1;
close $fh;

1 个答案:

答案 0 :(得分:10)

你可能会想到这个

$| = TRUE;  

$|设置为true值。然而这是错误的。如果您要启用警告,则会收到以下警告:

Argument "TRUE" isn't numeric in scalar assignment

您会看到$|实际上是0(false)。这是因为TRUE是一个单词(除非加载了一些带有常量的模块),它被解释为一个字符串,它被转换为一个数字,在这种情况下变为零0。所以请这样做:

$| = 1;

此特定变量只能包含值10。您可以直接设置它,在这种情况下它会影响当前select() ed文件句柄(默认为STDOUT)。或者您可以使用面向对象的表示法

STDOUT->autoflush(1);  # this is what you did
$fh->autoflush(1);     # this is what you want

因此,在上面的代码中,您需要执行此操作才能使其按预期工作:

select($fh);
$| = 1;

虽然您应该知道在关闭文件句柄时,会刷新影响它的所有缓冲区。