tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

ハッシュリファレンスのデリファレンス

ハッシュリファレンスのデリファレンスで初心者っぽいハマり方をしたので、メモ。

#!/usr/bin/perl
use strict;
use warnings;
use feature qw(say);

my $aa = {
    aaa => { bbb => 'ccc' },
    xxx => 'yyy',
};

say "aaa";
say $aa->{aaa}->{bbb};#ok

say "xxx";
say $aa->{xxx}->{bbb};#died

say "finished";

こんな感じのプログラムを作って実行すると、

tsucchi@seasons[121]% perl a.pl
aaa
ccc
xxx
Can't use string ("yyy") as a HASH ref while "strict refs" in use at a.pl line 15.

こんな感じで、$aa->{xxx}->{bbb}のデリファレンスでお亡くなりになります*1。まあこんなデータ構造を作る奴が悪いのですが、にしても、実際のプログラムで発生したときは、何が起きてるか分からなくてかなり焦りました。警告でもいいと思うんだけどなー。

対策が、no strict 'refs'か、ref $aa->{$key} eq 'HASH' みたいな判定を入れる、というのも「なんだかなー」という感じです。

まあやっぱりこういう変なデータ構造をつくっちゃダメですね。

*1:finished が表示されていないので、die しているのが分かる