作者: 閑舎
日時: 2002/8/26(03:03)
たむらけんいち <sgs02516@...> さん wrote.

> http://digit.que.ne.jp/work/index.cgi?Encode に Encode.pm の説明があります。
> 最新の BSD mag には、作者の小飼さんの記事があります。最近 ruby-talk の多言語に
> 関しての討論にも参加されてますね。

情報、ありがとうございます。Perl も Unicode を採用しちゃったわけか……時
代の趨勢ではあるけれど、汎用性が前進して、効率が後退、というところですね。

> 現在の Rubyは内部コードといったものはなく、スクリプトを書く人が指定しますね。
> #/usr/bin/ruby -Ks でシフトJISとか。
> 2.0では、Unicodeではないですが、内部コードみたいな仕組みを持つとか。

内部コードは確かに Emacs などで使われてはいて、中小規模のテキスト処理な
ら問題ないけれど、大規模となると速度がねぇ……。

> utf-8 対応の nkf が発表されたりしてるので、ちょっと組込んだりしてますが。

私もこれは見ました。自分の持ってるハッシュ表を使う必要がないからちょっと幸せ?

> # GNU Grep の 2.5 は、multi-byte対応のはずですが、どうでしょう ?
> # http://www.ruby-lang.org/~eban/diary/200203b.html#200203161
> # http://www.ruby-lang.org/~eban/diary/200203b.html#200203171

このソースは手許になかったんですが、昔の GNU grep 2.0 MB 版のはあったの
で、ちょっと比較をば。

テスト: 計 57MB の 4 個の EUC テキストファイルから「閑舎」という文字列を
        ふくむ行を探す(186 個見つかる)。結果はリダイレクトしてファイル
        へ落す。計測は time により、3 回の試行の平均とする(秒)。

言語   リアル時間  ユーザ時間  システム時間
jgrep        3.53        0.28          0.10
jsed         9.18        6.72          0.12
jgawk        2.60        1.89          0.30
perl         4.90        4.49          0.20
ruby         6.70        6.18          0.23

* jgrep '閑舎' datafiles
* jsed -ne '閑舎' datafiles
* jgawk -f '/閑舎/' datafiles
* perl -n g.pl datafiles
  # g.pl
  $ASCII = '[\x00-\x7f]';
  $TWOBYTES = '[\x8e\xa1-\xfe][\xa1-\xfe]';
  $THREEBYTES = '\x8f[\xa1-\xfe][\xa1-\xfe]';
  print "$_" if (/^(?:$ASCII|$TWOBYTES|$THREEBYTES)*?閑舎/);
* ruby -ne 'print if /閑舎/ =~ $_' datafiles

内部でプログラムを組みたいとなると、jgawk が一番という、ちょっと意外な結
果になりました。何かコマンドラインが不適切というようなことがあればご指摘
ください。

--
本田博通(閑舎)
Hiromichi Honda <raku@...>