[Mew-dist 05720] Re: code_check_body in Japanese.pm problem

SAKAI Kiyotaka ksakai at example.com
1998年 7月 28日 (火) 19:02:48 JST


>> In article <19980728183411O.os at example.com>, OHARA Shigeki <os at example.com> writes:

> さらに、imput での送信をしようとすると、
> Undefined subroutine &IM::Japanese::undefined called at /usr/local/lib/perl5/site_perl/IM/Japanese.pm line 194.
> というエラーになります。

済いません、以下のパッチを当てて下さい。

--- Japanese.pm.in	1998/07/28 09:49:28	1.1
+++ Japanese.pm.in	1998/07/28 09:50:01
@@ -191,7 +191,7 @@
 
     if ($code eq 'NoHankana') {
 	$code = uc(code_check($line, 1));
-    } elsif (undefined($code)) {
+    } elsif (! defined($code)) {
 	$code = uc(code_check($line));
     }
     $code = uc($main::Default_code) if ($code == 'SORE');


> # で、この問題の本質はどこにあるんでしょう?

元々のコードの問題点は、EUC か SJIS かを判定している正規表現が複雑過ぎ
るために perl が刺さるというのが原因のようです。

原因となっているコードを抜き出すと以下のようになりますが、これを EUC
でセーブして実行してみると、刺さることが分かるかと思います。

------------------------------ ここから ------------------------------
$C_sjis      = '([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+';
$C_sjis_kana = '([\xa1-\xdf])+';
$C_ascii     = '[\s\x21-\x7e]*';

$line = "スポーツで運動不足を解消する";

if ($line =~ /^($C_ascii($C_sjis|$C_sjis_kana))+$C_ascii$/o) {
    print "true\n";
} else {
    print "false\n";
}
------------------------------ ここまで ------------------------------

正規表現を単純にして判定するようにしたのが先の Japanese.pm ですが、安
全側にシフトするために半角仮名をサポートしたために、正規表現が複雑になっ
たという見方もあるかと思います。

Mew からは junet でコードでしか imput に渡すことはありませんので、Mew 
からメールを送信する分には、これが問題がになることはありませんが。
-- 
酒井 清隆 (E-mail: ksakai at example.com)



Mew-dist メーリングリストの案内