以前の記事、「bogofilter を正しく使おう」で書いた Mew 用判定スクリプトですが、高速化のために書き直しました。kakasi、nkf を perl のモジュールとして使用して全て perl で処理するようにしたのです。すると何と実行時間が 1/3 に短縮されました。
perl からこれらを使うために kakasi は Text::Kakasi を、nkf はソースを展開した後の NKF.mod サブディレクトリ以下にあるモジュールをインストールする必要があります。cygwin 上で特に特別なオプションをつけることなくコンパイル、インストールができました。
#!/usr/bin/perl use Email::MIME; use NKF; use Text::Kakasi; local $/; my $k = Text::Kakasi->new; $k->set("-w"); LOOP: foreach $filename (@ARGV) { open(I, $filename) || next LOOP; my $message = <I>; my $parsed = Email::MIME->new($message); my @parts = $parsed->parts; $message = nkf("-e", $parsed->_headers_as_string . "\n"); foreach my $p (@parts) { if ($p->content_type =~ /text/i) { $message = $message . nkf("-e", $p->body); } } my $tokenized = $k->get($message); open(O, "| bogofilter") || die("can't execute bogofilter"); print O $tokenized; close(O) && print "$filename\n"; close(I); }
稀におかしな形式のメールを処理するときに Email::MIME モジュールから Carp::croak が呼ばれて die してしまいやり残しのメールが出てしまうのですが、どうしたのものか考え中です。
2007. 2. 14 追記:
eval を使えば die をトラップできるというところまで調べました。ただ、綺麗に書ける自信なしです。
2007. 6. 16 追記:
内容を修正して改訂版を作っていますのでこちらを参照ください。