向哈希添加一个空数组

Adding an empty array to hash

有什么区别:

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

和:

my %y;
$y{'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'} = ();

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

不一样。在第一种情况下,您要分配给哈希元素。在第二种情况下,您正在分配给该哈希元素引用的数组。

除非它不包含对数组的引用,因此 Perl 通过称为“自动生成”的功能为您创建一个。也就是说,

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

等同于

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

其中 [] 创建一个数组并 returns 对它的引用。鉴于 $y{'12'} 是 non-existent,因此未定义,上面的内容简化为:

$y{'12'} = [];