Perl 将空数组添加到哈希

Perl 将空数组添加到哈希,perl,data-structures,perl-data-structures,Perl,Data Structures,Perl Data Structures,以下两者之间的区别是什么: my %x; push @{$x{'12'}}, (); 以及: 为什么以下内容适用于x而不适用于y my @x1 = @{$x{'12'}}; #legal my @y1 = @{$y{'12'}}; #illegal Data::Dumper将在此处告诉您问题: use strict; use warnings; use Data::Dumper; my %x; push @{$x{'12'}}, (); print Dumper \%x; my %y;

以下两者之间的区别是什么:

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

为什么以下内容适用于
x
而不适用于
y

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

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'} = [];
相反-
[]
表示匿名数组,其中
()
表示元素的空列表

$y{'12'} = ();

它们不一样。在第一种情况下,您将分配给哈希元素。在第二种情况下,您将分配给该散列元素引用的数组

只是它不包含对数组的引用,所以Perl通过一个名为“autovivification”的特性为您创建一个数组。换句话说,

@{$y{'12'}} = ();
相当于

@{ $y{'12'} //= [] } = ();
其中,
[]
创建一个数组并返回对该数组的引用。鉴于
$y{'12'}
不存在,因此未定义,上述内容简化为:

$y{'12'} = [];

这是一个好问题。它提醒我们,
perl-e'使用Data::Dumper;我的%y$y{'12'}=()$y{'13'}=[]$y{'14'}=未定义$y{'15'}=“”;打印转储程序\%y;'可以是教育性的/有教育意义的。而不是
-e使用…
你可以只使用
-M
自动激活会发生什么?在较新的PERL中,定义了
两个语句
$hash{'whatever2'}/=[];推送$hash{'whatever2'},“stuff”几个月后,我觉得它比使用
push@{$hash{'whatever2'}}“stuff”更具可读性。但是<代码>推送参考是实验性的…
。@G.Cito,关于“自动活体化会发生什么情况?”,没有计划或建议进行任何更改我想,
push$hash{'whatever2'},“stuff”
已经不存在了
推送$hash{'whatever'}->@*,“stuff”@G.Cito,是的,这在5.24中不再是经验
@{ $y{'12'} //= [] } = ();
$y{'12'} = [];