「初めてのPerl」 5章 (ハッシュ)
連想配列という言葉が長いからって「ハッシュ」と呼んでしまうPerl。この短さへの美学に少しでも迫れたら良いな、と思いながら勉強しているbonlifeです。ハッシュは名前をつけた箱にキーと値の組み合わせ放り込んで管理するイメージ。なんかちょっと違う気もしますが、まぁそんな感じです。ハッシュ全体を扱う時はパーセント記号(%)を使い、1つ1つの要素にアクセスする場合には、$hash{$some_key}となります。この頭の記号がコロコロ変わるのに慣れないといけませんね。
演習問題を解いてみました。だんだん書くのに時間がかかるようになってきました。先行き不安です…。
#! perl -w use strict; my %last_names = ( "fred" => "flintstone", "barney" => "rubble", "wilma" => "flintstone" ); print "Please input first name : "; my $first_name = <STDIN>; chomp $first_name; my $last_name = $last_names{$first_name}; if ( ! $last_name ) { print "No last name found for $first_name.\n"; } else { print "The last name of $first_name is $last_names{$first_name}.\n"; }
出力結果は以下の通り。
ex5-1.pl Please input first name : fred The last name of fred is flintstone.
ex5-1.pl Please input first name : bonlife No last name found for bonlife.
正解を見て気付いたことは以下の通り。
- 標準入力を変数に格納した後、chompする処理は1行で書ける
- ハッシュに値を入れる方法は色々ある (qw//リストなど)
ex5-2.pl
- 単語をいくつか入力させ、各単語が何回出現したかを表示
- 単語をASCIIコードの昇順にソートして表示
#! perl -w use strict; print "単語を次々と入力してください。カウントします。 : \n"; my @names = <STDIN>; chomp @names; my %result; foreach (@names) { $result{$_} += 1; } my @keys = sort keys %result; foreach (@keys) { print "$_ は $result{$_} 個ありました。\n"; }
出力結果は以下の通り。
ex5-2.pl 単語を次々と入力してください。カウントします。 : fred barney fred dino wilma fred ^Z barney は 1 個ありました。 dino は 1 個ありました。 fred は 3 個ありました。 wilma は 1 個ありました。
正解を見て気付いたことは以下の通り。
- 変数の宣言はまとめて行える (あちこちで宣言すると分かりづらい)
ダイアログを英語で書いたり、日本語で書いたり統一感がなくなってきちゃいましたよ。今後は英語で頑張ってみます。