![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
【質問】
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スクリプトでダブルクォーテ...
-
perlのpushについてです。
-
sprintfについて
-
[Perl]ファイル出力のエンコー...
-
ドメインからIPアドレスあるい...
-
perlでの文字列抽出
-
教えて!perlから.exeファイル...
-
コンソール出力をテキストに出...
-
オーバーラップ計算法について
-
sprintfで10進数を桁数指定で16...
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
openした後、closeしないでプロ...
-
空白文字 \\f と\\v の違いに...
-
FindFirstFileとFindNextFileで...
-
バッチファイルの作り方(CSV→...
-
batファイルでrenameができませ...
-
HTTP::Request::Common qw(POST...
-
エクセルVBA コードが同じでも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
sprintfについて
-
エクセルVBAで素数だけを出力す...
-
C言語の問題について
-
Perl<->Oracle間での文字化けに...
-
log2の「正確な」計算方法
-
教えて!perlから.exeファイル...
-
重複するデータを抽出できる秀...
-
Perlでファイルの末尾から指定...
-
CGIから外部コマンド実行時の標...
-
ファイル出力の改行コードをLFに
-
至急お願いします。C言語で.img...
-
LWPでPOST送信した後に送信先に...
-
perlでcsvの出力について
-
バッチファイルで、記号を含む...
-
Perl 内で実行される Perl が S...
-
文字コードの変換(Shift-JISか...
-
Perlでエラーログに日時をつける
-
Active Perl の動作異常について
おすすめ情報