【質問】
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で質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- Java Javaについて質問です。 勉強し始めたばかりの初心者です。 相続税について課税額を算出するコードを 1 2022/05/31 19:02
- Java Java 年数計算 3 2023/01/28 10:52
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java コンソールから所属財産を入力(単位:万円 1000~100000以内でIntegerに変換できない場 2 2022/05/31 21:32
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) Python3 標準入力されたものから行を指定して取り出す方法を教えて下さい 全部の入力された物なら 1 2022/12/18 21:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
ファイル出力の改行コードをLFに
-
sprintfで10進数を桁数指定で16...
-
Perl中で teeを使っても戻り値...
-
sprintfについて
-
DOSコマンドで、標準出力を出力...
-
Perlでファイルの末尾から指定...
-
ListBoxのデータを高速でファイ...
-
ExcelをCSV書き出す場合のシー...
-
C言語で特定の行を抽出する方法...
-
window.open でのファイル指定方法
-
パスから最後のディレクトリだ...
-
fgets で値が取得できない
-
ReadLineでの読み出し行を指定する
-
CSVデータの編集の際の重複チェ...
-
ifstream を利用した1行分のテ...
-
vba dir の相対パス
-
配列の中に重複文字列があるか...
-
オープンしたファイルで行の連結
-
perlで、後ろの行を読んで、前...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
重複するデータを抽出できる秀...
-
Perlでファイルの末尾から指定...
-
sprintfについて
-
[Perl]ファイル出力のエンコー...
-
エクセルVBAで素数だけを出力す...
-
文字コードの変換(Shift-JISか...
-
テキストファイルから日本語部...
-
sprintfで10進数を桁数指定で16...
-
ファイル出力の改行コードをLFに
-
Perlからsyslog経由でログを出...
-
PerlからのCSV出力
-
perlでcsvの出力について
-
教えて!perlから.exeファイル...
-
バッチファイルで、記号を含む...
-
perl CGIでのhttpヘッダー出力...
-
print文で&(半角)文字のエラー...
-
Perlでエラーログに日時をつける
-
紙にもホームページにも同じレ...
おすすめ情報