uzullaの日記

本家:about等:Twitter
 | 

2008-02-27

IO.popen(cmd_string, "r+") { |io| block } 便利だな

| 16:34

Perlとか使ってると、しばしば

open(NKF, ' | nkf | ');
print NKF $before;
$after = <NKF>;

みたいなことをしたくなると思う、俺だけかもしんないけど。

でも知っての通りこれはできない。


Rubyだと

    @source = '入力テキストです'
    cmd_string = [$MECAB_PATH, option].join(" ")
    @output = Array.new
    IO.popen(cmd_string, "r+") { |io|
      io.puts @source
      io.each{ |line|
        @output.push( line ) 
        if line =~ /EOS/ then
          break
        end
      }
    }

とかできるので便利すぎる。


まあ、Perlでもやろうと思えばできるんだけど

クックブックとかにもやり方は載っているのだけれど「デッドロックするからやめれ」という事ですね。

上のはMecabを呼び出すんですけど、まだプロトタイプなのでさっさと書きたかった、Windows環境だし。

最終的にはMeCabRubyバインディングを使う予定。

 |