「初めての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 個ありました。

正解を見て気付いたことは以下の通り。

  • 変数の宣言はまとめて行える (あちこちで宣言すると分かりづらい)

ダイアログを英語で書いたり、日本語で書いたり統一感がなくなってきちゃいましたよ。今後は英語で頑張ってみます。