有什么区别:
my %x;
push @{$x{'12'}}, ();
和
my %y;
$y{'12'} = ();
为什么以下内容适用于x
而不适用于y
?
my @x1 = @{$x{'12'}}; #legal
my @y1 = @{$y{'12'}}; #illegal
答案 0 :(得分: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'} = [];
相反 - []
表示匿名数组,其中()
表示元素的空列表。
答案 1 :(得分:7)
$y{'12'} = ();
和
@{$y{'12'}} = ();
不一样。在第一种情况下,您将分配给哈希元素。在第二种情况下,您将分配给该哈希元素引用的数组。
除非它不包含对数组的引用,因此Perl通过名为“autovivification”的功能为您创建一个。换句话说,
@{$y{'12'}} = ();
相当于
@{ $y{'12'} //= [] } = ();
其中[]
创建一个数组并返回对它的引用。以上简化如下:
$y{'12'} = [];