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