这是一个小样本。
my %X = ();
for (my $i = 0; $i < 5; $i ++)
{
$X {$i} = [$i .. 4]; # the assignment: reference to an unnamed array
}
# this is just for output - you can ignore it
foreach (sort keys %X)
{
print "\n" . $_ . " = ";
foreach (@{$X {$_}})
{
print $_;
}
}
输出与预期的一样。
0 = 01234
1 = 1234
2 = 234
3 = 34
4 = 4
如果我使用局部变量进行赋值,它将产生相同的输出-没关系! 列表的内存始终是重新分配的,不会被覆盖,因为@l始终是新的。在%X中仍然有对它的引用,因此无法发布(或者,但是perl中的内存管理正在工作-我不知道)。
for (my $i = 0; $i < 5; $i ++)
{
my @l = ($i .. 4); # inside
$X {$i} = \@l;
}
但是我可以使用外部变量从上方产生相同的输出吗?
是否可以通过一些分配技巧-像给它一个新的内存,而不是浪费旧的内存?
my %X = ();
my @l; # outside
for (my $i = 0; $i < 5; $i ++)
{
@l = ($i .. 4);
$X {$i} = \@l;
}
所有哈希元素现在都是最后一个循环的内容。
0 = 4
1 = 4
2 = 4
3 = 4
4 = 4
是否可以从外部变量开始获取输出?
答案 0 :(得分:3)
否,%X
的每个值都不可能引用不同的数组,而同时都引用同一数组。
如果您希望%X
的每个值都是对同一数组的引用,请继续在循环外部分配一个数组。
如果您希望%X
的每个值引用不同的数组,则需要为循环中的每个遍历分配一个新的数组。这可以是一个命名的(使用my
创建),也可以是一个匿名的(使用[ ]
创建)。
如果您只想使用外部@l
中的值,以便每个引用的数组最初都具有相同的值,则可以使用
my @a = @l;
$X{$i} = \@l;
或
$X{$i} = [ @l ];