1

基本的に、STDERR / STDOUTを再度開いて、ストリームとタイムスタンプの両方がすべての行に含まれる1つのログファイルに書き込むようにします。だからprint STDERR "Hello World"印刷しSTDERR: 20130215123456: Hello Worldます。すべてのprintステートメントを関数呼び出しに書き直したくありません。また、出力の一部は、system()書き直せない呼び出しを介して外部プロセスから送信されます。

また、出力をファイル「ライブ」に配置する必要があります。つまり、プロセスが完了したときに書き込まれるだけではありません。

(psタイムスタンプを生成する方法の詳細については特に質問していません。ファイルにリダイレクトして文字列を付加する方法だけを尋ねています)

私は次のコードを作成しましたが、面倒です。

my $mode = ">>";
my $file = "outerr.txt";
open(STDOUT, "|-", qq(perl -e 'open(FILE, "$mode", "$file"); while (<>) { print FILE "STDOUT: \$\_"; }'));
open(STDERR, "|-", qq(perl -e 'open(FILE, "$mode", "$file"); while (<>) { print FILE "STDERR: \$\_"; }'));

(上記は日付を追加しませんが、追加するのは簡単です)

よりクリーンなソリューション、perlコードを引用してコマンドラインに渡す必要のないソリューション、または少なくとも複雑さの一部を隠すモジュールを探しています。Capture :: Tinyのコードを見ると、出力の一部の書き込みを処理できるようには見えませんが、それについてはよくわかりません。annotate-output悲しいことに、外部コマンドでのみ機能します。外部コマンドと通常のPerl印刷の両方で機能するには、これが必要です。

4

1 に答える 1

2

経由で起動された子は、プログラム内の変数にアクセスできないため、system書き込みを行いません。STDOUTしたがって、Perl ファイル ハンドル書き込み (例: tie) でコードを実行しても機能しません。

STDOUT と STDERR をパイプに置き換えてスクリプトを実行する別のスクリプトを作成します。これらのパイプから読み取り、変更された出力を出力します。これを行うには IPC::Run を使用することをお勧めしますselect。STDOUT と STDERR を 1 つのストリームに組み合わせれば、それがなくても問題はありません。

于 2013-02-15T02:30:15.030 に答える