Snippets

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

Created by sironekotoro

File kansuuji_to_arabic_number__hash_table.pl Added

  • Ignore whitespace
  • Hide word diff
+#!/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";
+
+}
HTTPS SSH

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