Evg*_*eny 2 perl data-structures perl-data-structures
有什么区别:
my %x;
push @{$x{'12'}}, ();
Run Code Online (Sandbox Code Playgroud)
和:
my %y;
$y{'12'} = ();
Run Code Online (Sandbox Code Playgroud)
为什么以下工作x而不是y?
my @x1 = @{$x{'12'}}; #legal
my @y1 = @{$y{'12'}}; #illegal
Run Code Online (Sandbox Code Playgroud)
Data::Dumper 会告诉你这里的问题:
use strict;
use warnings;
use Data::Dumper;
my %x;
push @{$x{'12'}}, ();
print Dumper \%x;
my %y;
$y{'12'} = ();
print Dumper \%y;
Run Code Online (Sandbox Code Playgroud)
得到:
$VAR1 = {
'12' => []
};
$VAR1 = {
'12' => undef
};
Run Code Online (Sandbox Code Playgroud)
这两个命令不相同.
也许你想要:
$y{'12'} = [];
Run Code Online (Sandbox Code Playgroud)
相反 - []表示一个匿名数组,其中()表示一个空的元素列表.
$y{'12'} = ();
Run Code Online (Sandbox Code Playgroud)
和
@{$y{'12'}} = ();
Run Code Online (Sandbox Code Playgroud)
不一样.在第一种情况下,您将分配给哈希元素.在第二种情况下,您将分配给该哈希元素引用的数组.
除非它不包含对数组的引用,因此Perl通过名为"autovivification"的功能为您创建一个.换一种说法,
@{$y{'12'}} = ();
Run Code Online (Sandbox Code Playgroud)
相当于
@{ $y{'12'} //= [] } = ();
Run Code Online (Sandbox Code Playgroud)
where []创建一个数组并返回对它的引用.以上简化如下:
$y{'12'} = [];
Run Code Online (Sandbox Code Playgroud)