Text::MeCabがおかしい。某社社内より報告アリ。毎度ありがとうございます。

で、すでに数時間そのコードとにらめっこしている。なぜ思い通りに動かないのかよくわからない。根本的な問題はわかった。Text::MeCab::NodeオブジェクトがDESTROYされるのがなぜかスコープを脱出した時ではなく、Global Destruction時のタイミングで起こっているのが問題。

どういうことかというと、Perlは2つのタイミングでガーベッジコレクションを行う。ひとつはステートメントとステートメントの間(スコープが変わる時も含む)、そしてもうひとつはPerlのインタプレタ自体がメモリから削除されるGlobal Destruction時。

現在のText::MeCabでは、以下のように$nodeオブジェクトをどんどん変更して行っても、さっきまで入っていたオブジェクトのDESTROYが呼ばれずに、次のループに行ってしまう。そしてGlobal Destruction時に大量のDESTROYが走る。

my $mecab = Text::MeCab->new(); for(my $node = $mecab->parse($string); $node; $node = $node->next) { # do whatever }
でもこれだと(当たり前だけど)、for()内、いや、プログラムが終了されるまでメモリが解放されることがない。これでは駄目なのだ。SvREFCNT_incやSvREFCNT_decを色んなところに入れてみたんだけど、唯一正しいタイミングでガーベッジコレクトされるのは最初からSvREFCNTを0にしてしまう方法だけだった(これは当たり前のようにエラーがでる)

いったいどうすればいいんだ・・・?誰かヒントを・・・