添加一个空数组到哈希

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)

Sob*_*que 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;
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)

相反 - []表示一个匿名数组,其中()表示一个空的元素列表.


ike*_*ami 7

$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)