0
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线?

4

2 回答 2

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" );
}

我得到了输出:

在“test_print”之前
用“打印”打印
在“test_print”之后

有趣的 …

这与句柄被分配/解决的脚本执行的哪个阶段有关,但我现在不能完全确定它。

于 2013-08-22T19:25:37.900 回答
1

只是一个猜测,但它可能与需要刷新缓冲区有关。 Write()可能会这样做,而print()自然不会。

于 2013-08-22T20:20:32.710 回答