原因究明

たまたまお隣日記に出てきたid:naoya:20050408さんを読んで見ると、『正規表現をもりっとGETして』…なんて書いてあるってことは、それなりに実用になるという事か。うーん。

そこで、まずuse utf8;を外し、正規表現ファイルをEUC-JPに戻し、さらにプログラムもEUC-JPに変換して、昔ながらの手法で試してみる。…と成功。メモリもぐんぐん伸びるという事も無い。なるほど、use utf8;かPerlIO layer、或いはutf-8の扱い自体のどれかに問題があるわけか。

次にプログラム、正規表現ファイルをUTF-8化し、レイヤーは使わずそのまま試してみる。ふむ、時間はかかるもののメモリ使用量の増大は無く終了。処理時間はEUC-JPの時もこんなもんだったかもしれないが、メモリに目が行っていたので良く分からない。

次にuse utf8;を入れて、キーワードリスト側をdecodeしてみる。これはメモリがぐんぐん伸びる。decode直後にdieしてみると即座に終了。ということは、utf8によるマッチングで問題が起きているのか。なるほど、これが悪かったらしい。

それじゃあと言う事で、キーワードリスト側はオクテット列のまま、置換対象データをencodeしてやってみる。ほう、これは問題なしだ。

まぁ、処理に時間がかかる事は変わりないが、オクテット列でマッチングしてやれば比較的マシな動作をするらしい。ちょっとこれでやってみよう。