向哈希添加一个空数组
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'} = [];
有什么区别:
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'} = [];