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

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

#!/usr/bin/env perl

use strict;
use warnings;
use Lingua::JA::Kana;
use utf8;
use Encode;

my $hiragana = romaji2hiragana('aerosmith');
print 'hiragana: '.Encode::encode('utf8',$hiragana)."\n";
\# hiragana: あえろsみth

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

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More qw/no_plan/;
use utf8;

use Lingua::JA::Yomi;

my $converter = new Lingua::JA::Yomi;
is( $converter->convert('aerosmith'), 'エアロウスミス','aerosmith');

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

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

# pass in utf8 flagged string
sub convert {
    my ($self, $roman, $remainder) = @_;
    $remainder ||= ";
    print "[convert]roman: $roman remainder: $remainder\n" if $self->debug;

    return if ! $roman;

    $roman = uc $roman;

    if ( $roman =~ /^([^A-Z]+)(.*)/ ) {
        \# preserve symbols
        return $2 ? ( $1 . $self->convert($2) ) : $1;
    }
    elsif ( exists $self->dic->{$roman} ) {
        print "[convert]found: $roman, ".Encode::encode('utf8',$self->dic->{$roman})."\n" if $self->debug;
        if ( ! $remainder ) {
            return $self->dic->{$roman};
        }
        else {
            return $self->dic->{$roman} . $self->convert( $remainder );
        }
    }
    else {
        my $last_of_roman = chop( $roman );
        return $self->convert( $roman, $last_of_roman . ($remainder || ") );
    }
}

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