Win32 ::控制台和STDOUT

时间:2013-08-22 17:35:12

标签: perl winapi console stdout

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行?

2 个答案:

答案 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()自然不会。

相关问题