From: Yoshinori Toki Date: 1998-12-01T23:24:21+09:00 Subject: [ruby-list:11170] 安直な perl 拡張 土岐です。 以前 Ruby から Perl を操作する拡張モジュールがあったら便利だという話が ありましたが、ふと、Perl には eval 関数があるんだから、perl インタープ リタを起動して perl スクリプトを文字列で送ってやって eval で評価させた らいいんじゃないかと思いつきました。効率は非常に悪そうですが、わざわざ C で書かなくてもすぐにできそうなので、とりあえず動くものを作ってみまし た。 こいつは IO.popen で perl を起動して標準入出力で通信しているので print を実行させるとエラーになってしまうというジャンクな設計ですが、きちんと プロトコルを設計して IPC で通信し、あと複雑な手続きを呼ぶときは perl 側でまえもってサブルーチンを定義してそのサブルーチンを呼ぶようにするな ど運用面で気をつければ、それなりに使えるものができるのではないかと思う のですが、どうでしょう。 だれか perl にも詳しい ruby hacker が改造してくれないかなあ(他力本願)。 ================ perl_eval.rb ================ # # perl_eval.rb # $Author: toki$ # $Revision: 1.3 $ # $Date: 1998-12-01 22:24:22+09 $ # # -- # 説明: # ruby のための超安易な perl 拡張。 # きわめて効率は悪い。 # require "final.rb" class PerlEval include ObjectSpace # perl インタープリタ PERL = "#{ENV['HOME']}/ruby/lib/perl_eval.pl" # perl インタープリタを終了する。 def exit @perl.close end # perl インタープリタを起動する。 def initialize @perl = IO.popen(PERL, "w+") define_finalizer(self, proc { self.exit }) end # perl の式を評価する。 def eval(expr) @perl.print expr.length, "\n" @perl.print expr @perl.flush case @perl.gets when /success/ num = @perl.gets.to_i list = Array.new(num) num.times do |n| len = @perl.gets.to_i list[n] = @perl.read(len) end list when /failure/ len = @perl.gets.to_i msg = @perl.read(len) fail msg else fail "unkown error." end end end ================ perl_eval.pl ================ #!/usr/local/bin/perl # # perl_eval.pl # $Author: toki $ # $Revision: 1.2 $ # $Date: 1998-12-01 11:22:45+09 $ # -- # 説明: # perl_eval.rb のための perl 評価用スクリプト。 # require "flush.pl"; while () { read(STDIN, $expr, $_); @eval = eval($expr); if ($@) { print "failure\n"; print length($@), "\n"; print $@; } else { print "success\n"; print $#eval + 1, "\n"; foreach $eval (@eval) { print length($eval), "\n"; print $eval; } } flush(STDOUT); } ---------------------------------------------------------------------- 土岐 仁謙 神戸大学自然科学研究科前期博士課程物理学専攻高エネルギー物理学講座 Yoshinori Toki HEP, Department of Physics, Faculty of Science, Kobe University TEL: +81 (78) 803 0543 FAX: +81 (78) 803 0724 URL: http://www.phys.sci.kobe-u.ac.jp/~toki/toki.html Email: toki@hep.phys.sci.kobe-u.ac.jp (public) Email: toki@freedom.ne.jp (private) PGP fingerprint = D0 A8 90 AB 73 F8 34 FE CE CA DB BF 01 30 C0 35