2016-01-18 2 views
2

В чем разница между:Добавление пустой массив хэш

my %x; 
push @{$x{'12'}},(); 

и:

my %y; 
$y{'12'} =(); 

Почему следующая работа для x и не для y?

my @x1 = @{$x{'12'}}; #legal 
my @y1 = @{$y{'12'}}; #illegal 
+0

Это хороший вопрос. Напоминаем, что 'perl -e 'использует Data :: Dumper; my% y; $ y {'12 '} =(); $ y {'13 '} = []; ; $ y {'14 '} = undef; $ y {'15 '} = ""; print Dumper \% y;' 'может быть учебным/поучительным. –

+0

Вместо '-e use ...' вы можете просто использовать '-M' – Sobrique

ответ

7
$y{'12'} =(); 

и

@{$y{'12'}} =(); 

не то же самое. В первом случае вы назначаете хэш-элемент. Во втором случае вы назначаете массив, на который ссылается этот хэш-элемент.

За исключением того, что он не содержит ссылки на массив, поэтому Perl создает для вас функцию, называемую «автовивизация». Другими словами,

@{$y{'12'}} =(); 

эквивалентно

@{ $y{'12'} //= [] } =(); 

где [] создает массив и возвращает ссылку на него. Вышеприведенное упрощает следующее:

$y{'12'} = []; 
+0

Что произойдет с авто-оживлением? В новых perls с 'define/or' двумя операторами' $ hash {'whatever2'} // = []; push $ hash {'whatever2'}, "stuff", 'казался более читаемым мне месяцами после его написания, чем с помощью' push @ {$ hash {'whatever2'}}, "stuff"; '. Но ... «нажмите на ссылку экспериментально ...». –

+0

[Эффективная статья Перлера о самовоспроизводстве] (http://www.effectiveperlprogramming.com/2011/04/understand-autovivification/). –

+1

@G. Cito, Re «Что будет происходить с авто-вивификацией?», Никаких изменений не планировалось или даже не предлагалось. /// Я думаю, что 'push $ hash {'whatever2'}," stuff "' уже ушел. – ikegami

8

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'} = []; 

Вместо этого - [] обозначает анонимный массив, где () обозначает пустой список элементов.

Смежные вопросы