我正在尝试快速更改文件大小并遇到文件从未使其大小合适的问题。下面的代码是否像我认为的那样运行?主要是$|
运算符实际选择$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;
答案 0 :(得分:10)
你可能会想到这个
$| = TRUE;
将$|
设置为true值。然而这是错误的。如果您要启用警告,则会收到以下警告:
Argument "TRUE" isn't numeric in scalar assignment
您会看到$|
实际上是0
(false)。这是因为TRUE
是一个单词(除非加载了一些带有常量的模块),它被解释为一个字符串,它被转换为一个数字,在这种情况下变为零0
。所以请这样做:
$| = 1;
此特定变量只能包含值1
或0
。您可以直接设置它,在这种情况下它会影响当前select()
ed文件句柄(默认为STDOUT)。或者您可以使用面向对象的表示法
STDOUT->autoflush(1); # this is what you did
$fh->autoflush(1); # this is what you want
因此,在上面的代码中,您需要执行此操作才能使其按预期工作:
select($fh);
$| = 1;
虽然您应该知道在关闭文件句柄时,会刷新影响它的所有缓冲区。