0

printいくつかのスクリプトで混乱を減らす方法を探しています。一部の出力をファイルに、一部を画面に、一部を両方に出力したいと考えています。私を逃れているのは「両方へのいくつか」です。STDOUT と既に編集されているファイルの両方に行くFILEHANDLEを開く方法はありますopenか?

このようなもの:

open ($file_only, ">", "$logfile");
open ($file_and_term, .....);


print $file_and_term "Nice stuff for the user to see\n";
print $file "$some_command\n";
print $file `$some_command`;   
$debug && print $file "some debug info goes here, too\n";
print "Hey, good job! You're done!\n"

私の目標は、送信さ$file_and_termれる行が二重の行にならないようにすること$fileです.1つはSTDOUTに行き、もう1つはSTDOUTに行きます。また、デバッグレベルに基づいて、おそらくデバッグselectレベルによって制御されるステートメントを使用して、より動的にすることもできます。


したがって、上記を書いている間、私は自分のニーズに合った解決策を思いつきましたが、私の欲求には合いませんでした. :)それで、別のエレガントなソリューションを実装しながら、この質問を投稿します。


私はこれをやった....それは通常のほど素晴らしいものではありませんが、print後でより堅牢にすることができます....

sub printit {
    my ($opt, $text) = @_;
    if ($opt == $FILE || $opt == $BOTH) {print $LOG $text}
    if ($opt == $TERM || $opt == $BOTH) {print $text}
}      
4

1 に答える 1

0

前の質問への回答で示唆されているように、使用IO::Teeして言うことができます

my ($file, $file_and_term);
open $file, '>', $logfile;
$file_and_term = IO::Tee->new( $file, \*STDOUT );
于 2013-03-27T17:17:14.880 に答える