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

めでたしめでたし。

[上に] [前に] [次に]