Чтобы уточнить пост Телемаха, неинициализированные значения будут неопределенными. Глубокие части структуры авививифицированы . Это удобная функция, где структуры данных создаются для вас автоматически. Автовификация хороша, когда вы этого хотите, но это может быть болезненно, если вы хотите предотвратить это. В сети много учебников, статей и постов по пониманию автовивификации.
Таким образом, с учетом неопределенных $ref
и $ref->{ipv6}{pa}{'foo'}++
, $ref
будет присвоено значение:
$ref = {
ipv6 => {
pa => {
foo => undef
}
}
};
Тогда undef будет увеличен, поскольку undef нумерует до 0, мы получаем 0 ++, который равен 1.
Для окончательного результата: ref->{ipv6}{pa}{'foo'} == 1
.
Если у вас включены предупреждения (вы делаете use warnings;
, не так ли?), Вы получите предупреждение «Неинициализированное значение» при работе с этими неопределенными значениями. Если вы хотите увеличить единичное значение по желанию, вы можете отключить желаемую группу предупреждений над ограниченной частью вашего кода:
use strict;
use warnings;
my $res;
// run query to fetch IPv6 resources
while( my $row = $org_ip6_res->fetchrow_arrayref )
{ no warnings 'uninitialized';
if( $row->[4] =~ /PA/ ) {
$res->{ipv6}{pa}{$row->[2]}++;
} elsif( $row->[4] eq 'PI' ) {
$res->{ipv6}{pi}{$row->[2]}++;
}
}
Вы можете найти иерархию предупреждений в perllexwarn .