2

ここで別の質問へのフリードによる、以下に引用されたこの回答について質問があります。(コメントする権限がありませんので、質問させていただきます。)

File::Teeを使用できます。

use File::Tee qw(tee);
tee STDOUT, '>>', 'some_file.out';
print "w00p w00p";

が利用できない場合File::Teeは、パイプラインで簡単にシミュレートできます。

open my $tee, "|-", "tee some_file.out";
print $tee "w00p w00p";
close $tee;

このTシャツはどちらも同じですか?それとも、一方が Perl のもので、もう一方が Linux/Unix のものですか?

4

1 に答える 1

5

ほとんど同じですが、実装の詳細が異なります。

パイプを開いてtee some_file.out新しいプロセスをフォークし、その中で Unix / Linux ユーティリティ プログラムtee(1)を実行します。このプログラムは、標準入力 (つまり、パイプに書き込むもの) を読み取り、それsome_file.outを標準出力 (プログラムから継承) と同様に両方に書き込みます。

tee明らかに、これは Windows や、Unix スタイルのコマンドを提供しない他のシステムでは機能しません。


一方、 File::Teeモジュールは純粋な Perl で実装されており、外部プログラムには依存しません。ただし、そのドキュメントによると、新しいプロセスをフォークし、その下で本質的に Unix コマンドの Perl 再実装であるものを実行することによっても機能します。teeドキュメントに記載されているように、これにはいくつかの利点があります。

「これはforkの周りに実装されており、ティー化されたすべてのストリームに対して新しいプロセスを作成します。そのようにして、システムで実行される外部プログラムまたはperlioを通過しない XS モジュールによって生成された出力の処理に問題はありません。」

一方、 の使用にforkはマイナス面もあります。

「バグ

Windows では動作しません (パッチを歓迎します)。"


teeすべてのプラットフォームで動作する機能の純粋な Perl 実装が必要な場合は、代わりにIO::Teeの使用を検討してください。File::Tee とは異なり、このモジュールは PerlIO を使用して実装され、fork. system残念ながら、これは、 PerlIO をバイパスする XS モジュールで実行される外部プログラムの出力を正しくキャプチャできない可能性があることも意味します。

于 2013-07-24T13:37:05.007 に答える