【質問】
Perl内部で実行される実行ファイル(.exe)のコンソール出力(STDOUT,STDERR)をテキストファイルに出力したい。(Perlのコンソール出力も含む。) ※コンソール出力は残しつつ。
(コマンドプロンプトの)パイプとリダイレクトを使用して上手くいくかと思ったのですが、標準出力と標準エラーとでは標準エラーが先に出力されてしまい、本来出力される順番で出力されない。(標準出力はバッファにたまるため??)
何かいい方法はありませんでしょうか?
【環境】
Windows2000
Active Perl 5.8.8
No.1ベストアンサー
- 回答日時:
CPANモジュールの File::TeeとかIO::Teeを使うというのはどうでしょうか?
File::Tee - replicate data sent to a Perl stream - search.cpan.org
http://search.cpan.org/~salva/File-Tee-0.03/lib/ …
use File::Tee qw(tee);
# simple usage:
tee(STDOUT, '>', 'stdout.txt');
print "hello world\n";
IO::Tee - Multiplex output to multiple output handles - search.cpan.org
http://search.cpan.org/~kenshan/IO-Tee-0.64/Tee.pm
use IO::Tee;
use IO::File;
my $tee = new IO::Tee(\*STDOUT,
new IO::File(">tt1.out"), ">tt2.out");
print join(' ', $tee->handles), "\n";
for (1..10) { print $tee $_, "\n" }
for (1..10) { $tee->print($_, "\n") }
$tee->flush;
この回答への補足
調べてみたのですが、File::TeeモジュールはWindowsでは使用できないみたいですね。
別の方法を検討してみます。
ありがとうございました。
回答ありがとうございます。
ただ、勉強不足のため間違っていたら申し訳ないのですが、Teeモジュールを使用することで、二つ以上のハンドルに同時出力しているのだと思います。しかし、これではPerl内部で実行される実行ファイルのコンソール出力までは出力先を変更できないのではないでしょうか?
説明がわかりにくかったかと思いますので、例を記述します。以下のprint文とsystem()で出力される標準出力と標準エラーをテキストファイルに取得したいのです。(コンソール出力は残したままで)
※下の例ではエラーは発生しませんが。。
(例)
$cmd = "dir"; # 実行ファイルの代わり。
print"カレントディレクトリ内のファイルを表示 開始\n";
system($cmd); # 実際には.exeファイル
print"カレントディレクトリ内のファイルを表示 終了\n";
説明不足で申し訳ございませんでした。どなたかご教授いただけると助かります。
No.3
- 回答日時:
ん?
手元では Windows XP + ActivePerl 5.8.6 だけど, なんとなく
-------------------- ここから
open(STDERR, ">&STDOUT");
print "foo\n";
print STDERR "bar\n";
system('echo "foo foo"');
system('echo "bar bar" 1>&2');
-------------------- ここまで
でうまくいっている (system 内の echo も含めて全て標準出力に出ている) 感じなんですけど....
No.2
- 回答日時:
要は「標準エラーと標準出力が同じところに出ればいい」ので,
open(STDERR, ">&STDOUT");
または
open(STDOUT, ">&STDERR");
でなんとかなっちゃったりして.
返事が遅くなり申し訳ございません。および意見をいただきありがとうございます。
ファイルハンドルを別のものに置き換える(関連付ける?)方法というのも考えていたのですが、system()などには反映されない模様。
sakusaker7さんに教えていただいたIO::Teeモジュールを使用して以下のようにしてみた。
#-----------------------------------------------------------
(sample)
use IO::Tee;
my $tee = IO::Tee->new(\*STDOUT,">stdout.txt");
select(*$tee); # print文のデフォルトハンドルに設定
$cmd = "dir"; # 実行ファイルの代わり。
print"カレントディレクトリ内のファイルを表\示 開始\n";
system($cmd); # 実際には.exeファイル
print"カレントディレクトリ内のファイルを表\示 終了\n";
#-----------------------------------------------------------
すると。。print文の内容はコンソール・テキスト両方に出力されるのにsystem()の出力はコンソールにしか出力されない。
うーむ。。わかる方、おりましたらお教えください。
ただ、私も勉強不足が身に染みたので、しばらくしたら質問を閉めさせていただき、出直してきます。
回答をいただけた方、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
log2の「正確な」計算方法
-
Perlでエラーログに日時をつける
-
DOSコマンドで、標準出力を出力...
-
バッチファイルの作り方(CSV→...
-
ExcelをCSV書き出す場合のシー...
-
close()で例外が投げられる理由
-
python renameについて
-
Perlの変数に文字数制限(容量...
-
空白文字 \\f と\\v の違いに...
-
readdir()で得られるファイル・...
-
fopenでディレクトリ内の全ファ...
-
ディレクトリ名を取得したい
-
テキストファイルの各行を配列...
-
VBAのFileFormatで悩んでいるこ...
-
VBAでCSVファイルを途中行まで...
-
unlink 、renameが使えない理由
-
5万件対5万件のデータを高速...
-
巨大なテキストの最終行を取得...
-
perlをwindows環境でshift-jis...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
DOSコマンドで、標準出力を出力...
-
sprintfについて
-
重複するデータを抽出できる秀...
-
教えて!perlから.exeファイル...
-
自動更新
-
[Perl]ファイル出力のエンコー...
-
Rubyを使ってtelnetで実行した...
-
文字コードの変換(Shift-JISか...
-
Perlからsyslog経由でログを出...
-
無名配列にスライスを使いたい。
-
Perl内でJavaScri...
-
perlでの文字列抽出
-
Perl<->Oracle間での文字化けに...
-
PerlからのCSV出力
-
ファイル出力の改行コードをLFに
-
機器のI/OをArduinoでSDに記録...
-
コンソール出力をテキストに出...
-
Perlでエラーログに日時をつける
おすすめ情報