В чем разница между:Добавление пустой массив хэш
my %x;
push @{$x{'12'}},();
и:
my %y;
$y{'12'} =();
Почему следующая работа для x
и не для y
?
my @x1 = @{$x{'12'}}; #legal
my @y1 = @{$y{'12'}}; #illegal
В чем разница между:Добавление пустой массив хэш
my %x;
push @{$x{'12'}},();
и:
my %y;
$y{'12'} =();
Почему следующая работа для x
и не для y
?
my @x1 = @{$x{'12'}}; #legal
my @y1 = @{$y{'12'}}; #illegal
$y{'12'} =();
и
@{$y{'12'}} =();
не то же самое. В первом случае вы назначаете хэш-элемент. Во втором случае вы назначаете массив, на который ссылается этот хэш-элемент.
За исключением того, что он не содержит ссылки на массив, поэтому Perl создает для вас функцию, называемую «автовивизация». Другими словами,
@{$y{'12'}} =();
эквивалентно
@{ $y{'12'} //= [] } =();
где []
создает массив и возвращает ссылку на него. Вышеприведенное упрощает следующее:
$y{'12'} = [];
Что произойдет с авто-оживлением? В новых perls с 'define/or' двумя операторами' $ hash {'whatever2'} // = []; push $ hash {'whatever2'}, "stuff", 'казался более читаемым мне месяцами после его написания, чем с помощью' push @ {$ hash {'whatever2'}}, "stuff"; '. Но ... «нажмите на ссылку экспериментально ...». –
[Эффективная статья Перлера о самовоспроизводстве] (http://www.effectiveperlprogramming.com/2011/04/understand-autovivification/). –
@G. Cito, Re «Что будет происходить с авто-вивификацией?», Никаких изменений не планировалось или даже не предлагалось. /// Я думаю, что 'push $ hash {'whatever2'}," stuff "' уже ушел. – ikegami
Data::Dumper
расскажет вам эту проблему здесь:
use strict;
use warnings;
use Data::Dumper;
my %x;
push @{$x{'12'}},();
print Dumper \%x;
my %y;
$y{'12'} =();
print Dumper \%y;
Дает:
$VAR1 = {
'12' => []
};
$VAR1 = {
'12' => undef
};
Обе команды не эквивалентны.
Может быть, вы хотите:
$y{'12'} = [];
Вместо этого - []
обозначает анонимный массив, где ()
обозначает пустой список элементов.
Это хороший вопрос. Напоминаем, что 'perl -e 'использует Data :: Dumper; my% y; $ y {'12 '} =(); $ y {'13 '} = []; ; $ y {'14 '} = undef; $ y {'15 '} = ""; print Dumper \% y;' 'может быть учебным/поучительным. –
Вместо '-e use ...' вы можете просто использовать '-M' – Sobrique