romkan.plはperl5.005_03では未対応?
[上に]
[前に]
[次に]
PTAN
[E-Mail]
1999/12/02(木) 22:33:33
jcode.plの作者が作られたローマ字→カナ変換のライブラリromkan.pl
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/romkan.pl-1.7
を使っているのですが、perl5.005_02では正しく動いていたのですが、
perl5.005_03だと、変換されずにローマ字のまま出力されてしまう
ようです。
テストしたプログラムはromkan.plのソース内にあるサンプルで、
環境はLinuxです。
もしかすると、Linux環境だけかもしれませんが、回避方法をご存知
の方、いらっしゃらないでしょうか?
ふじ
1999/12/03(金) 04:03:12
回答になってなくて恐縮ですが、うちでもその現象を確認しました。
Vine Linux1.1 (kernel 2.2.13)
perl 5.004_04 では正常に動作しましたが、
perl 5.005_03 ではダメでした。
スレッドが有効になっている Perl だと jcode.pl が使えない
から、その件かな、とも思ったのですが、それでもないみたい。
#参考 http://www.din.or.jp/~ohzaki/perl.htm#JP_Trans
PTAN
1999/12/03(金) 11:00:52
ふじさん、情報ありがとうございます。
perlは全てデフォルト設定でインストールしているので、
スレッドも無効になっています。
ちなみに、Solaris2.6でもテストした所、同様に
perl5.005_02 ○
perl5.005_03 ×
でした。
ということは、perlか,,,
大崎 博基
[E-Mail]
[HomePage]
1999/12/03(金) 13:00:25
これは perl5.005_03 で $',$&,$` が redo や next で初期化されてしまうというバグ?が原因です.歌代さんには私からメールしておきましたので,いずれ正式な修正版が出ると思いますが,ちょっと長いですがパッチを書いておきます.手で直す場合は下のパッチの行頭に ! がつく部分が変更部分になりますので参考にしてください.
*** romkan.pl-1_7 Fri Dec 3 12:19:47 1999
--- romkan.pl-1_8 Fri Dec 3 12:25:55 1999
***************
*** 38,44 ****
;#
;# require('romkan.pl');
;# while (<>) {
! ;# s/[\w\-\']+/&romkan($&)||$&/ge unless 1 .. /^$/;
;# print;
;# }
;#
--- 38,44 ----
;#
;# require('romkan.pl');
;# while (<>) {
! ;# s/([\w\-\']+)/&romkan($1)||$1/ge unless 1 .. /^$/;
;# print;
;# }
;#
***************
*** 101,112 ****
local($_, $code, $katakana) = @_;
local($kana) = '';
while (length) {
! % . join('', grep(++$i%2 && ($_ = "\tnext if s/^$_//i;\n"), @romkan)) . q%
next if s/^[\d\']//;
! next if s/^([%.$consonants.q%])\1/\1/i;
last;
} continue {
! $kana .= $romkan{"\L$&"};
}
return undef if length;
$kana =~ s/\244(.)/\245$1/g if $katakana;
--- 101,112 ----
local($_, $code, $katakana) = @_;
local($kana) = '';
while (length) {
! % . join('', grep(++$i%2 && ($_ = "\tnext if s/^($_)//i;\n"), @romkan)) . q%
next if s/^[\d\']//;
! next if s/^([%.$consonants.q%])\1/$1/i;
last;
} continue {
! $kana .= $romkan{"\L$1"};
}
return undef if length;
$kana =~ s/\244(.)/\245$1/g if $katakana;
***************
*** 126,132 ****
while (<>) {
print unless -t STDIN;
! s/[\w\-\']+/&romkan($&,$code,$katakana)||$&/ge;
print;
}
}
--- 126,132 ----
while (<>) {
print unless -t STDIN;
! s/([\w\-\']+)/&romkan($1,$code,$katakana)||$1/ge;
print;
}
}
PTAN
1999/12/03(金) 19:41:31
[[解決]]
上記変更により、ばっちり動くようになりました。
どうもありがとうございましたm(__)m
> これは perl5.005_03 で $',$&,$` が redo や next で初期化されてしまうというバグ?が原因です.
それにしても、バグか仕様か気になる所ですね...
大崎 博基
[E-Mail]
[HomePage]
1999/12/04(土) 00:08:26
上のパッチには漏れがありました.
next if s/^[\d\']//; のところを
next if s/^([\d\'])//; とする必要があります.
歌代さんからお返事で判明(^^;
PTAN
1999/12/06(月) 09:41:02
> 上のパッチには漏れがありました.
φ(..;
ちなみに、本家の方も更新されていました。
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/romkan.pl-1.8
めでたしめでたし。
[上に]
[前に]
[次に]