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

理由はわかりませんが、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" );
}

そして、私は出力を得ました:

「test_print」の前
「印刷」で印刷
「test_print」の後

面白い …

これは、ハンドルが割り当てられる/解決されるスクリプトの実行のフェーズと関係がありますが、今のところ、指を置くことはできません。

于 2013-08-22T19:25:37.900 に答える