復習メモ

練習問題5.5.1の解答を見て、ひとつの疑問が氷解。
ハッシュの一部だけをmyで宣言できないようだ。


疑問というのは、初めてのPerl [5.2 ハッシュの要素にアクセスする]で以下のようなコードがあって、

$family_name{"fred"} = "flintstone";
$family_name{"barney"} = "rubble";

これを次のようなコードを用いてキーに対応するハッシュの値を表示するというもの。

foreach $person (qw< barney fred >) {
    print "I've heard of $person $family_name{$person}.\n";
}

しかしuse strictプラグマを使用して、以下のようにmy宣言をして実行すると、

my $family_name{"fred"} = "flintstone";
my $family_name{"barney"} = "rubble";

以下のようなエラーが出てしまった。ハッシュfamily_nameにはGlobal symbolが必要とかなんとか。

Global symbol "%family_name" requires explicit package name at hoge.pl line 6.
Global symbol "%family_name" requires explicit package name at hoge.pl line 7.
Global symbol "%family_name" requires explicit package name at hoge.pl line 10.
Execution of hoge.pl aborted due to compilation errors.

前章の[4.10 use strictプラグマ]の項で、これ以降は use strictプラグマ有効を前提としてコードを書くYO!と言っているので、my宣言すると、以下のようなエラーメッセージが。

syntax error at hoge.pl line 4, near "$family_name{"
Execution of hoge.pl aborted due to compilation errors.

今度はsyntax error。
やっていることは正しいはずなのに、どうしてエラーがでるのか?
いくら考えてみても明確な答えは出なかったのでこの問題を放置していたら、思わぬところで解が。


ハッシュの一部に対してはmy宣言できないんですね。
「初めてのPerl」が矛盾していて、つまづいた箇所でした。
同じようにつまづいた人が検索をして、この記事にたどり着いてくれれば。

( 5/9 追記 )
コメント欄で、いつもアドバイスをくださるid:kidd-number5さんに解決策を教えていただいた。
それにしても、上に「同じようにつまづいた人が検索をして、この記事にたどり着いてくれれば。」こんな事が書いてあるけど、肝心の解決策が書いてないじゃん。
ダメダメ。

kidd-number5 『もしかして
my $family_name{”fred”} = ”flintstone”;
こうした??

エラーにも出ている通り
”%family_name” requires explicit package name
だから、my %family_name;しておいてから中身を書いていけばいいってことだったのかな?』 (2006/05/08 09:29)

id:kidd-number5さんの言うとおりで、

my $family_name{”fred”} = ”flintstone”;

としました。

こうした場合、前述の様なエラーがでてしまいますが、そこをid:kidd-number5さんのアドバイス通りに my %family_name; を用いて、

my %family_name;
$family_name{"fred"} = "flintstone";
$family_name{"barney"} = "rubble";

と記述して実行すると…

I've heard of barney rubble.
I've heard of fred flintstone.

バッチリですね。
id:kidd-number5さん、いつもありがとうございます。