Запись
if (defined $HoH{$c}{$d}) {...}
будет «работать» настолько, что сообщит вам, имеет ли $HoH{$c}{$d}
определенное значение. Проблема в том, что если $HoH{$c}
еще не существует, он будет создан (с соответствующим значением), чтобы можно было проверить $HoH{$c}{$d}
. Этот процесс называется "автовивификацией". Это удобно при установке значений, например
my %hoh;
$hoh{a}{b} = 1; # Don't need to set '$hoh{a} = {}' first
но неудобно при извлечении возможно несуществующих значений. Мне бы хотелось, чтобы Perl был достаточно умен, чтобы выполнять автовивификацию только для выражений, используемых как lvalues и short-circuit, чтобы возвращать undef
для rvalues, но, увы, это не так волшебно. Прагма autovivification (доступная в CPAN) добавляет функциональность для этого.
Чтобы избежать автовивификации, сначала нужно проверить промежуточные значения:
if (exists $HoH{$c} && defined $HoH{$c}{$d}) {
...
}