cmd1.exe は、標準入力でデータを読み込み、
結果を標準出力するようなプログラムです。
$ cmd1.exe < test.txt
d090206
p314159
r214142
$
このcmd1.exeをperlスクリプト内で呼び出し、その結果を求めるやり方として、
従来、次のようなやりかた・・・
open(OUT,">temp.txt") || die "$!";
foreach(・・・){
中略
print OUT "$_\n";
}
close(OUT);
my @answer = `cmd1.exe < temp.txt`;
foreach(@answer){
:
略
}
unlink("temp.txt");
のようなことをしています。
今は、中間ファイルを書き出しては、最後にファイル削除して、ということをやっているのですが、
このような中間ファイルを使わずに、パイプ(?)という仕組みを使って、同じように処理させるには、
どのようにコーディングすれば良いですか?
試してみたこととして、
open(PIPE,"|cmd1.exe");
foreach(・・・){
中略
print PIPE "$_\n";
}
close(PIPE);
のようにすれば、exeの呼び出しそのものは出来たのですが、
その標準出力の結果を上手く内部で受け取れません。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
#2です。
あなたがなさりたいことは、こういうことですか。#! /bin/perl
use IPC::Open2;
$pid = open2 RFH,WFH,"cmd1.exe";
# 子プロセスへ出力
foreach (1..10){
print WFH "AAAA",$_,"\n";
}
close WFH;
# 子プロセスから入力
@list = <RFH>;
foreach(@list){
print "XXX",$_;
}
--------------------------------
cmd1.exeのソースの内容は
#! /bin/perl
while(<>){
print $.,":",$_;
}
-----------------------
以下、実行結果
XXX1:AAAA1
XXX2:AAAA2
XXX3:AAAA3
XXX4:AAAA4
XXX5:AAAA5
XXX6:AAAA6
XXX7:AAAA7
XXX8:AAAA8
XXX9:AAAA9
XXX10:AAAA10
-----------
cmd1.exeは標準入力からデータを受け取り、標準出力へ処理結果を出力する。
perl本体は、cmd1.exeにとっての入力データを出力用パイプへ出力し、
cmd1.exeの処理結果を入力用パイプから読みとる。
この回答への補足
お返事が遅くなり申し訳ございません。
open2()についてネットで調べて、出来たつもりになっていたのですが、
その後、上手く行かずにてこずっています。
上記、示していただいたサンプルでは、
close WFH;
の後、処理が止まってしまい、その後、何かキー入力して、ctrl+cを押すと、
-------------------------------------------------------------
Terminating on signal SIGINT(2)
D:\FACTORY\Perl\OPEN2>
D:\FACTORY\Perl\OPEN2>aa
'aa' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
D:\FACTORY\Perl\OPEN2>
-------------------------------------------------------------
のようになってしまいます。
ここで、aa は、close WFH語に停止しているときに、キー入力した文字です。
---
※申し遅れました。環境は、Windows-XP/ActivePerlのv5.8.6を使っています。
お世話になります。
サンプルプログラムのご提示やその動作結果まで教えて頂き、ありがとうございました。
その後、調べましたら、WindowsのActivePerlでは、
open2( )は機能しないようなことが書いてありました。
また、上記で止まってしまっているのは、close部分ではなくて、
@list = <RFH>;
の部分のようです。
もともと、やりたかったことは、tatsu99様でご推察して下さったように、
ある外部コマンドへの標準入力、および、そのコマンドからの標準出力を、
テンポラリなファイルを作らずにスクリプト本体でやりとりすること。
でした。
WindowsのActivePerlで実現する方法が他にありましたら、
お手数ですが、よろしくお願い致します。
No.2
- 回答日時:
なにをなさりたいのかがよくわかりませんが、
cmd1.exe は標準入力からデータを読み込み、結果を標準出力へ出力する。
cmd2.exeはcmd1.exeの出力結果を入力データとして受け取りたいと言うことでしょうか。
もし、そうなら
cmd1.exe < test.txt | cmd2.exe
で良いとおもいます。
cmd2.exeは、標準入力からデータを受け取るようにコーディングして下さい。
(環境(OS等)が不明なのでlinuxという前提で回答しました)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- WordPress(ワードプレス) [BuddyPress]試したいのですが! 3 2022/06/01 13:36
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CPU・メモリ・マザーボード BIOSアップデート 3 2022/07/09 22:30
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DOSコマンドで、標準出力を出力...
-
CGIから外部コマンド実行時の標...
-
log2の「正確な」計算方法
-
Perlでファイルの末尾から指定...
-
awkスクリプトでダブルクォーテ...
-
fopenでディレクトリ内の全ファ...
-
バッチファイルの作り方(CSV→...
-
vba dir の相対パス
-
batファイルでrenameができませ...
-
VBAコードを張り付け後のエクセ...
-
複数ファイルを1つにするシェ...
-
外部サーバーにあるファイルを...
-
shellのコマンド deffの差分の...
-
VBAでCSVファイルの特定行を書...
-
MATLAB グローバル変数の宣言
-
ListBoxのデータを高速でファイ...
-
Perlで空白行を削除
-
openした後、closeしないでプロ...
-
ADOによるCSVファイルからのデ...
-
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でエラーログに日時をつける
-
紙にもホームページにも同じレ...
おすすめ情報