Lingua::JA::Yomi 日本語読みモジュールをつくった

Posted on 11月 28, 2008
Filed Under japanese, coderepos, perl |

英語を手軽に日本語にしたいと思ってつくった。

今あるモジュールだと、Lingua::JA::Kanaっていうのがあってローマ字→ひらがな変換はできる。

PERL:
  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Lingua::JA::Kana;
  6. use utf8;
  7. use Encode;
  8.  
  9. my $hiragana = romaji2hiragana('aerosmith');
  10. print 'hiragana: '.Encode::encode('utf8',$hiragana)."\n";
  11. # hiragana: あえろsみth

でもローマ字にあてはまらないのは上記のように残念な感じになるので、
Lingua::JA::Yomi ってのをつくった。
http://coderepos.org/share/browser/lang/perl/Lingua-JA-Yomi/trunk

PERL:
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use Test::More qw/no_plan/;
  5. use utf8;
  6.  
  7. use Lingua::JA::Yomi;
  8.  
  9. my $converter = new Lingua::JA::Yomi;
  10. is( $converter->convert('aerosmith'), 'エアロウスミス','aerosmith');

ルー語インスパイアなので辞書は
Bilingual Emacspeak Project
のを使わせていただいております。

今、あの紫の本を読んでるので、再帰処理で少しずつ変換していくとこを実装するのがたのしかったー

PERL:
  1. # pass in utf8 flagged string
  2. sub convert {
  3.     my ($self, $roman, $remainder) = @_;
  4.     $remainder ||= '';
  5.     print "[convert]roman: $roman remainder: $remainder\n" if $self->debug;
  6.  
  7.     return if ! $roman;
  8.  
  9.     $roman = uc $roman;
  10.  
  11.     if ( $roman =~ /^([^A-Z]+)(.*)/ ) {
  12.         # preserve symbols
  13.         return $2 ? ( $1 . $self->convert($2) ) : $1;
  14.     }
  15.     elsif ( exists $self->dic->{$roman} ) {
  16.         print "[convert]found: $roman, ".Encode::encode('utf8',$self->dic->{$roman})."\n" if $self->debug;
  17.         if ( ! $remainder ) {
  18.             return $self->dic->{$roman};
  19.         }
  20.         else {
  21.             return $self->dic->{$roman} . $self->convert( $remainder );
  22.         }
  23.     }
  24.     else {
  25.         my $last_of_roman = chop( $roman );
  26.         return $self->convert( $roman, $last_of_roman . ($remainder || '') );
  27.     }
  28. }

perl って何回まで再帰できるんだろ

Comments

Leave a Reply