2011-12-23 9 views
4

印刷 "文字列"コードを繰り返さずに、 "表示"と同時にファイルに印刷する方法はありますか?私が何をしたいかPerl: "ディスプレイ"とファイルにも印刷

if ($ofile) { 
    open (FILE, '>>', "file"); 
    print "Hello" #some code#; #prints on the display and into the file 
} 

の代わり:

if ($ofile) { open (FILE, '>>', "file"); } 
print "Hello"; 
if ($ofile) { print FILE "Hello"; } 

はグーグルで試みたが、私が見つけたすべてが、両方が一緒に特徴のいずれかであったか、ではありません。

編集の質問を追加するには:

次に、新しいT字型に分岐ハンドルを作成し、印刷はデフォルトでそれを使用するように$ティを選択するために、IO :: Tシャツを使用しています。 - Eric Strom

@EricStrom新しいtee'dハンドルを作成するとどういう意味ですか?このLocal::TeeOutputを意味しますか? search.cpan.org/~mschilli/Log-Log4Log1/3.4/lib/Log/Log4perl.pm

@EricStrom例がありますか?

@EricStrom Local :: TeeOutputは、Strawberry Perlのデフォルトライブラリでは使用できません。既定のライブラリの中に何か別の選択肢がありますか?

答えて

5

これは、ロギングのためであるならば、あなたは画面、ファイル、さらにはデータベースに同じもののログを持つことができますLog::Log4perl

を使用することを検討してください。

これは、画面とファイルの両方に記録する完全な例です。

use strict; 
use Log::Log4perl qw(:easy); 
Log::Log4perl->easy_init("INFO"); 

my $logConfiguration = qq(
log4perl.logger  = INFO, Logfile, Screen 
log4perl.appender.Logfile   = Log::Log4perl::Appender::File 
log4perl.appender.Logfile.filename = C:\\temp\\file.log 
log4perl.appender.Logfile.layout = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.Logfile.layout.ConversionPattern =%p[%d{MM/dd HH:mm} %3L] %m%n 
log4perl.appender.Screen   = Log::Log4perl::Appender::Screen 
log4perl.appender.Screen.stderr = 0 
log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout 
log4perl.appender.Screen.layout.ConversionPattern = %m%n 
); 

Log::Log4perl::init(\$logConfiguration); 

INFO "This line will be logged"; 

ERROR "This error will be logged"; 

LOGDIE "Fatal error will be logged"; 

構成のいずれかINFOERRORなどが呼び出されたときにファイル(ログファイル)及びスクリーン(画面)の両方が追加されることを示しています。

FAQは多くの質問タスクのためのサブルーチンをしないのはなぜ

+0

このapiをインストールする必要がありますか、それともStrawberry Perlがプリインストールされていますか? –

+0

@ parapura-rajikumar何かを印刷するだけです。 Log4perlのprint_portfolioサブ関数は使用していますか? –

+0

@JohnTan答えは私の編集をご覧ください。私は完全な例を持っています。あなたのPerlのインストールがまだそれを持っていなければLog4perlをインストールする必要があります。一度それのハングアップを取得します..あなたはすべてのプリントを停止します:) –

1

をカバー?

また、Log::Log4perlのような多くのロギングパッケージは、非常に簡単な設定でコンソールとファイルの両方への書き込みをサポートしています。

+0

何かを印刷するだけです。 Log4perlのprint_portfolioサブ関数は使用していますか? –

+0

@ JohnTan - その場合、両方のストリームにそのパラメータを送るサブルーチン 'print_out'を作ってみませんか? Log4perlはおそらくあなたが望むものを提供しません。 – bvr

9

確かに、IO::TeeをCPANにしてください。 perlのデフォルトのハンドルに変更するには

my $tee = IO::Tee->new(\*STDOUT, \*STDERR, $John, $Tan); 
print $tee "HELLO!\n"; 

select $tee; 
print "HELLO!\n"; 
+0

それは私が探しているものではありません。私は元のプリントと同じ正確な行にそれを維持しようとしています。 –

+2

そして 'IO :: Tee'を使って新しいtee'dハンドルを作成し、' select $ tee'を実行して、 'print'がデフォルトでそれを使用するようにします。 –

+0

@EricStrom新しいtee'dハンドルを作成するとどういう意味ですか?このLocal :: TeeOutputという意味ですか? http://search.cpan.org/~mschilli/Log-Log4perl-1.34/lib/Log/Log4perl.pm –

関連する問題