package MY_TEST;
use warnings;
use strict;
use Win32::Console;
my $out = Win32::Console->new( STD_OUTPUT_HANDLE );
sub test_print {
$out->Write( "printed with 'Write'\n" );
print( "printed with 'print'\n" );
}
当我使用此脚本调用此包时
#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.0;
use FindBin qw($RealBin);
use MY_TEST;
say 'Before "test_print"';
MY_TEST::test_print;
say 'After "test_print"';
输出看起来像这样
Before "test_print"
printed with 'Write'
printed with 'print'
After "test_print"
但是当我评论Write
行
# $out->Write( "printed with 'Write'\n" );
输出为空。
为什么删除Write
行会阻止打印print
行?
答案 0 :(得分:1)
我不知道原因,但我可以使用ActiveState的perl 5.16.3复制Windows XP SP3下的行为。
在预感中,我在MY_TEST.pm
中进行了以下更改:
my $out;
sub test_print {
$out ||= Win32::Console->new( STD_OUTPUT_HANDLE );
# $out->Write( "printed with 'Write'\n" );
print( "printed with 'print'\n" );
}
我得到了输出:
Before "test_print" printed with 'print' After "test_print"
有趣......
这与句柄被分配/解决的脚本执行的哪个阶段有关,但我现在无法完全理解它。
答案 1 :(得分:1)
只是一个猜测,但它可能与需要刷新缓冲区有关。 Write()
可能会这样做,print()
自然不会。