Perl сделает именно то, что вы описали
Эта функция называется автовивификацией.Это означает, что контейнерные объекты появятся сразу после их использования.Это сохраняется до тех пор, пока вы не нарушите какой-либо прецедент, который вы установили сами.
Например, попытка разыменования чего-либо как хеша, если вы уже использовали его в качестве ссылки на массив, является ошибкой.В более общем смысле, если значение определено, оно может быть разыменовано как определенный тип, только если оно содержит ссылку на этот тип.
Если вы также хотите защитить от неправильного использования, вы можете заключить вложенный поиск вeval
block:
my $x = eval{ $hash{first}[0]{second}{third}[3] };
Это вернет undef
, если eval
не удастся.Обратите внимание, что это НЕ строка Eval, которая будет написана eval '....';
.В блочной форме Perl eval
аналогичен конструкции try {...}
в других языках.
Чтобы определить, произошел ли сбой eval
или действительно ли значение в этой позиции undef
, проверьте, не является лиспециальная переменная $@
имеет значение true.Если это так, eval
не удалось, и причина будет в $@
.Было бы написано:
my $x = eval{ $hash{first}[0]{second}{third}[3] };
if (!$x and $@) { die "nested dereference failed: $@" }
Или вы можете использовать модуль Try :: Tiny , который абстрагирует детали реализации и защищает от нескольких крайних случаев:
use Try::Tiny;
my $x;
try {
$x = $hash{first}[0]{second}{third}[3];
} catch {
die "nested dereference failed: $_";
};