ハッシュリファレンスのデリファレンス
ハッシュリファレンスのデリファレンスで初心者っぽいハマり方をしたので、メモ。
#!/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 しているのが分かる