1

我正在尝试快速更改文件大小并遇到文件从未达到正确大小的问题。下面的代码是否像我认为的那样运行?主要是$|运营商在选择$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;
4

1 回答 1

10

你可能会想这个

$| = TRUE;  

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

Argument "TRUE" isn't numeric in scalar assignment

你会看到这$|实际上是0(错误的)。这是因为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;

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

于 2013-10-16T16:29:12.373 回答