• ベストアンサー

ベストマッチさせる方法

市外局番からもっともマッチした地域を表示させたいのですが。。 どうしますか? 例 %kyokuban=( 03=>東京1, 031=>台東区, 0312=>上野, 0313=>日暮里, 032=>墨田区, ); $test=0312; ????????わかりません???????

質問者が選んだベストアンサー

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

No.2さんの回答をみて やっと質問の意味が分かりました. hashのキーで最短のではなく, 最長のでマッチさせたいと解釈するのですか. ならば・・・hashのキーを 長い順にチェックすればいいです. use strict; use warnings; use Encode; use encoding 'cp932'; my %kyokuban=( "03" => "東京", "031" => "台東区", "0312" => "上野", "0313" => "日暮里", "032" => "墨田区", ); sub get_area_name_for_tel_num{ my $tel_num = shift; for ( sort { length $b <=> length $a } keys %kyokuban ){ if ( $tel_num =~ m {\A ($_) }x ){ return "$kyokuban{$1}"; } } return "No match"; } #正しい結果になるかは別問題. print get_area_name_for_tel_num("0312220000"),"\n"; print get_area_name_for_tel_num("0392220000"),"\n";

その他の回答 (2)

  • racci
  • ベストアンサー率64% (9/14)
回答No.2

以下のhogeのような感じの関数にすればよいと思います。 %kyokuban=( '03' =>'東京1', '031' =>'台東区', '0312'=>'上野', '0313'=>'日暮里', '032' =>'墨田区', ); print &hoge('0312220000'); # →上野 sub hoge { my $num = shift; while (length($num) > 0) { if (exists $kyokuban{$num}) { return $kyokuban{$num}; } chop($num); } return "不明"; }

回答No.1

入力された局番に完璧にマッチするだけでいいのであれば, #******************************* %kyokuban=( '03' =>'東京1', '031' =>'台東区', '0312'=>'上野', '0313'=>'日暮里', '032' =>'墨田区', ); $test ='0312'; print $kyokuban{$test} if ( exists $kyokuban{$test} ); #************************************************ というような方法がありますが,いかがでしょうか?

関連するQ&A