[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 メーリングリストの案内