2013-08-22 30 views
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"); 
} 

当我把这个包这个脚本的Win32 :: Console和STDOUT

#!/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

你有尝试混合这两种方法的原因吗? –

+0

我使用的是'Win32 :: Console :: ANSI',所以大多数时候我可以使用'print'来确定光标位置,我需要一个'Win32 :: Console-> new(STD_OUTPUT_HANDLE)'对象。 –

回答

1

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

+0

为什么'Flush'对输出有影响 - 文件说'Flush'会刷新控制台输入缓冲区? –

+0

为什么两者都能正常工作:在“print”之前冲洗并在“print”之后冲洗? –

+0

根据我在任何I/O任务中的经验,刷新通常适用于输出。不知道为什么文档表明它是特定于输入。我相信之前和之后的刷新与为什么在写入之前或之后进行写操作相似:两个命令都以某种方式排队,并在不分之后执行刷新。这都是猜测。 –

1

我不知道原因,但我可以在Windows XP SP3下使用ActiveState的perl 5.16.3复制行为。

在一种预感,我取得了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"

有趣…

这与脚本执行的哪个阶段处理被分配/解决有关,但我现在无法完全掌握它。