Snippets

sironekotoro 漢数字をアラビア数字にする(ハッシュテーブル利用)

Created by sironekotoro
#!/usr/bin/perl
use strict;
use warnings;

# 今回のように、スクリプト内に直接マルチバイト文字(日本語の全角文字など)を
# 使う場合には use utf8; する
use utf8;

# スクリプト内に書かれたマルチバイト文字(日本語の全角文字など)を標準出力する
# 場合には Encode モジュールを使う。
use Encode qw/encode_utf8/;

# 0〜99までの数字を漢数字を受け取ってアラビア数字にする

# 与えられる文字列
my @array
    = ('一',  '二',  '十',  '十一',  '三四', '二十一', '三十四', '三十', '三〇');

# ハッシュテーブル
# 漢数字とアラビア数字の変換表
my %hash = (
     => 0,
     => 1,
     => 2,
     => 3,
     => 4,
     => 5,
     => 6,
     => 7,
     => 8,
     => 9,
     => 10,
);


# 与えられた漢数字を1つずつ処理
for my $kan_suuji (@array){

    # 回答のアラビア数字用のスカラー変数を用意します
    my $answer = 0;

    # 漢数字を1文字ずつsplitで分割する
    my @array = split // , $kan_suuji;


    # 分割すると今回の条件では3パターンに分かれる
    # 1文字(配列の要素が1つ):'一',  '二',  '十'
    # 2文字(配列の要素が2つ):'十一', '三四', '三十', '三〇'
    # 3文字(配列の要素が3つ):'二十一', '三十四'

    # 配列の要素ごとにif文で処理を分岐する
    # 1文字(配列の要素が1つ):'一',  '二',  '十' のとき
    if (scalar @array == 1){
        my $kan_suuji = shift @array;
        $answer = $hash{$kan_suuji};
    }

    # 2文字(配列の要素が2つ):'十一', '三四', '十一', '三〇' のとき
    elsif(scalar @array == 2){
        # 漢数字が2桁の場合には、
        # $array[0]に十の位
        # $array[1]に一の位
        # が格納されています

        # 十の位, 一の位のアラビア数字を格納する変数を用意します
        my $jyuu_no_kurai  = 0;
        my $itchi_no_kurai = 0;


        # ここで注意が必要なのが、十一 と 三十 と三四 です
        # 漢数字の 十 が 「十の位にある」「一の位にある」「含まれない」パターンがあります
        # ここでさらにif文で分岐させます

        # 十の位に漢数字の 十 が入るパターン
        if ($array[0] eq '十'){
            # 十の位に 漢数字の 十 が入っている場合には 10 〜 19 のアラビア数字になるはずです
            $jyuu_no_kurai = 10;
            # 一の位は 1文字の漢数字と同じようにハッシュテーブルで処理します
            $itchi_no_kurai = $hash{$array[1]};
            $answer = $jyuu_no_kurai + $itchi_no_kurai;
        }

        # 一の位に漢数字の 十 が入るパターン
        elsif($array[1] eq '十'){
            # 一の位に 漢数字の 十 が入っている場合には 10 20 30 40 .. 90 のアラビア数字になるはずです
            # このため、十の位の数字をハッシュテーブルか取得し、
            # それを10倍した値を答えとします
            $answer = $hash{$array[0]} * 10;
        }

        # 漢数字の 十 が含まれないパターン
        elsif($array[0] ne '十' && $array[1] ne '十'){

            # ハッシュテーブルから数字をもってきて、それを計算します
            $answer = $hash{$array[0]} * 10 + $hash{$array[1]};
        }

    }

    # 3文字(配列の要素が3つ):'二十一', '三十四' のとき
    elsif(scalar @array == 3){
        # 漢数字が3桁の場合には、
        # $array[0]に十の位
        # $array[1]に 漢数字の 十
        # $array[2]に一の位
        # が格納されています

        # ハッシュテーブルから数字をもってきて、それを計算します
        $answer = $hash{$array[0]} * 10 + $hash{$array[2]};

    }

    # 漢数字をエンコードして表示する
    print encode_utf8($kan_suuji) . " => " . $answer . "\n";

}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.