3

ファイルに出力するがファイルを開かない関数が欲しいのですが、代わりに、すでに開いているファイルハンドルをファイルに渡す必要があります。このように、ファイルのオープンとクローズは、コードの呼び出しブロックで1回だけ発生します。

私は試した:

sub teeOutput
{
    my $str = $_[0];
    my $hndl = $_[1];

    #print to file
    print $hndl $str;
    #print to STDOUT
    print $str;
}

そしてそれを呼び出すとき

open(RPTHANDLE, ">", $rptFilePath) || die("Could not open file ".$rptFilePath);

&teeOutput('blahblah', RPTHANDLE);
&teeOutput('xyz', RPTHANDLE);

close(RPTHANDLE);

しかし、それはうまくいきませんでした。

これを達成する方法はありますか?

ありがとう

4

1 に答える 1

9

まず、ファイルハンドルにグローバル変数を使用するのをやめます。

open(my $RPTHANDLE, ">", $rptFilePath)
   or die("Could not open file $rptFilePath: $!\n");

それなら...まあ、「その時」はありません。

teeOutput($RPTHANDLE, 'blahblah');
teeOutput($RPTHANDLE, 'xyz');
close($RPTHANDLE);

ノート:

  • 私は議論を逆にしたteeOutput
  • のプロトタイプ&をオーバーライドするためにディレクティブ()を削除しました。持っていません。teeOutputteeOutput

(ただし、グロブに対処する必要がある場合は、を使用してteeOutput(\*STDERR, ...);ください。)

于 2013-01-30T00:11:10.687 に答える