凄い不思議な質問タイトルになってしまいましたが……(笑)
下記のようなソースを実行したとします。
-------------------------○ source.pl
open(IN, "<dest.pl");
foreach(<IN>){$s.=$_;}
close(IN);
eval($s);
このとき、source.pl で実行される dest.pl には別の Perl プログラムが入っています。
で、dest.pl の内部にはいくつかの print ""; があって、標準出力をおこなっているわけですが、この標準出力結果を画面には出さず、source.pl 側で受け取る事はできないもんでしょうか。
@r = `dest.pl`;
という方法もあるとは思うんですが、なんとか eval でやりたいのです。
なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。
何かご存知の方がいらっしゃいましたら、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
子プロセスでevalし、その出力をpipeで読んではどうでしょうか。
if (open IN, "dest.pl") {
local $/;
$s = <IN>;
close IN;
}
pipe RDP, WRP;
if (my $pid = fork) { # 親
close WRP;
chomp(@r = <RDP>);
close RDP;
wait;
}
elsif (defined $pid) { # 子
close RDP;
select WRP; # 標準出力を WRP に変更
$| = 1; # バッファリングを止める
eval($s);
close WRP;
exit;
}
else { die $! } # fork失敗
foreach (@r) {
print "$_\n";
}
No.1
- 回答日時:
open(IN, "dest.pl |");
foreach(<IN>){
# 標準出力を受け取るだけの処理
# 標準出力は $_ で取れる
# dest.plの内容によっては、この処理はなくてもいいでしょう
}
close(IN);
dest.plを実行し、標準出力をパイプで取得するというのではいけないのでしょうか?
evalを実行するところまでの処理が無駄だと思いますが。
.plがperlに関連付けられてないと実行されないので、openのところでは、
open(IN, "perl dest.pl |");
と明示的にperlを呼ぶ必要があるかもしれません。
この回答への補足
>dest.plを実行し、標準出力をパイプで取得するというのではいけないのでしょうか?
はい。駄目なんです(^_^;
作っていただいたソースはありがたいのですが、実際には dest.pl の中身は、Perl 以外の他の言語のプログラムが雑多に混じっており、Perl 部だけを抜き出して実行する必要があるのです。
抜き出した Perl を一度テンポラリファイルに書き込む方法も考えたんですが、処理が遅くなるので eval でやりたいわけです。
まぁ、今んとこ一度ファイルに書き込む動作は必要かなという気はしてますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 簿記検定・漢字検定・秘書検定 簿記3級の問題についてです。大問3の精算表の問題なのですが未払い消費税から下の科目を貸借対照表に書く 1 2023/03/02 13:48
- 法学 法律の事を勉強し始めて数日なのですが、少しこんがらがってます。 PL法で、例えばヘアドライヤーを使用 1 2022/10/09 22:38
- 関西 夏の甲子園が嫌です... 3 2022/08/04 17:16
- 宗教学 PL教はカルトの部類に入りますか? 毎月の教会費の他に褒賞と言うお布施を半強制的 月に五千円以上払い 5 2022/07/14 13:15
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- 宗教学 自民以外で、カルト宗教から支援受けてる政党は? 1 2022/07/25 14:46
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- 風邪・熱 朝、PL顆粒を服用しました。 夜、パブロン飲んでもいいでしょうか? PL顆粒は、だるくなりますか? 1 2022/08/27 15:04
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル出力の改行コードをLFに
-
エディターでは改行なのにメモ...
-
awkスクリプトでダブルクォーテ...
-
ドメインからIPアドレスあるい...
-
[awk]uniq -cで複数ファイルの...
-
機器のI/OをArduinoでSDに記録...
-
DOSコマンドで、標準出力を出力...
-
教えて!perlから.exeファイル...
-
オーバーラップ計算法について
-
Perlで特定行から特定行までを...
-
バッチファイルの作り方(CSV→...
-
VBAでCSVファイルの特定行を書...
-
C言語で特定の行を抽出する方法...
-
C言語のバイナリモードでのfsca...
-
close()で例外が投げられる理由
-
ヒアドキュメントの書き方
-
MATLAB グローバル変数の宣言
-
utf-8のCSVをshift_jisに変換し...
-
chdirがうまくできない
-
openした後、closeしないでプロ...
マンスリーランキングこのカテゴリの人気マンスリー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でエラーログに日時をつける
-
紙にもホームページにも同じレ...
おすすめ情報