• ベストアンサー

ハッシュを使っての検索をつける機能について

たびたび質問失礼します。 いまハッシュについて勉強しているのですが そこで検索をいれるというやり方がいまいちわかりません。 key :名前(アルファベット) value :出身 例 yamada => aichi suzuki => hirosima tanaka => tokyo satou => tokyo saitou => kanagawa itou => hokkaidou 上記のものを作ったのですが そのあと検索をいれて、キーボードからKeyまたはvalueを入力して各当するものが見つかった場合、画面に「Keyとvalue」を表示して、なければを「見つかりません」と表示させたいのですが動作しないのです。 プログラム、助言等お願いいたします。

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

  • ベストアンサー
noname#11136
noname#11136
回答No.1

ハッシュ全体をループを使って見ていく。つまり、全てのキーに基づいて、検索語と一致するものがないかを試せばいいと思います。 %town = ( yamada => aichi, suzuki => hirosima, tanaka => tokyo, satou => tokyo, saitou => kanagawa, itou => hokkaidou, aichi => saitama, miyagi => okinawa, ); do { print "検索語?"; chomp($findword = <STDIN>); } while ($findword !~ /^\w+$/); foreach $name (keys %town) { if ($name eq $findword) { $found_name = 1 } if ($town{$name} eq $findword) { $found_town = 1; push(@name, $name) } } if ($found_name == 1) { print "名前:$findword\n"; print "出身:$town{$findword}\n"; } if ($found_town == 1) { print "名前:@name\n"; print "出身:$findword\n"; } if ($found_name != 1 && $found_town != 1) { print "見つかりません\n"; }

terunosuke
質問者

お礼

返信遅れてすみませんでした。 解りやすく見やすいお答えありがとうございます。

その他の回答 (1)

  • bender
  • ベストアンサー率45% (108/236)
回答No.2

キーボードからの入力値には改行記号がついていると思うのですが(例、"yamada\n")、それを取り除かずに検索するので失敗したのではないでしょうか。改行記号を除くためには、No.1 の方が書かれているように、"chomp" コマンドが有用だと思います。 また、入力値 $key が与えられたとき、ハッシュ %hash にその値が登録されているか調べるためには、defined $hash{$key} のようにすれば良いと思います。 例、 if(defined $hash{$key}) {  printf("%s => %s\n",$key,$hash{$key}); } さらに、入力値をハッシュの value として関連するキーを検索する必要がある場合、value と key の役割を反対にしたハッシュを新たにつくっておくとよいかもしれません。ところで、もとのハッシュは、複数のキーが同一の値をもつので(例、tanaka=>"tokyo", satou=>"tokyo" )、このあらたに作られるハッシュについては、キーに対して、配列を返す必要があるかもしれません(例、tokyo=>("tanaka", "satou") )。 以下のプログラムを実行して(実行後プロンプトはでないのですが)"aichi" や、"tokyo" を入力すると、それに対する適当な出力があると思います。 %hash=(yamada=>"aichi",  suzuki=>"hiroshima",  tanaka=>"tokyo",  satou =>"tokyo"); map {push(@{$hash_rev{$hash{$_}}},$_)} keys %hash; while(<stdin>) {  chomp;  printf("key: %s\nvalue: %s\n",$_,$hash{$_})   if(defined $hash{$_});  printf("value: %s\nkey(s): %s\n",$_,join(", ",@{$hash_rev{$_}}))   if(defined $hash_rev{$_}); }

terunosuke
質問者

お礼

解りやすい解説をありがとうございます。 参考になりました。

関連するQ&A