【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

 凄い不思議な質問タイトルになってしまいましたが……(笑)

 下記のようなソースを実行したとします。

-------------------------○ 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 でやりたいのです。

 なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。
 何かご存知の方がいらっしゃいましたら、よろしくお願いします。

A 回答 (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";
}
    • good
    • 0
この回答へのお礼

 ありがとうございます。

 こういうの知りたかったんです!
 試してみますね!

お礼日時:2004/06/29 17:24

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 でやりたいわけです。

 まぁ、今んとこ一度ファイルに書き込む動作は必要かなという気はしてますが。

補足日時:2004/06/29 14:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qperlでの平均計算について

以下のようなデータがあります。そこでカラム1が等しい値をもつものを一グループとし、カラム2の平均値を求めたいのですが、なかなかうまくいきません。どなたかご教授をお願いいたします。よろしくお願いします。



カラム1   カラム2

1         123.93
1         322.32
1         232.21
1         124.32
1         234.12
2         123.43
2        12.34
2          .
2          .
2          .
3 
3
3
4
4
4
4

Aベストアンサー

それほど プログラムができる人間ではないですが。。。
このような ロジックではいかがでしょうか?

連想配列hashを 2種類活用し、
1つ目のhash
カラム1の種類ごとに カラム2を足していく。
(hash{カラム1}に どんどん カラム1が同じもののカラム2の値を足していく。)
hash{カラム1}=hash{カラム1}+カラム2

2つ目のhash2
カラム1の種類ごとに、各カラム1のおなじものが 何個あるか カウントしていく。
(hash2{カラム1}に カラム1が同じものをカウントしていく。)
hash2{カラム1}=hash2{カラム1}+1

平均値は
hash{カラム1}/hash2{カラム1}で 求まると思います。


人気Q&Aランキング

価格.com 格安SIM 料金比較