Perl:命名变量的范围和分配

时间:2018-07-17 16:48:22

标签: perl

这是一个小样本。

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

是否可以从外部变量开始获取输出?

1 个答案:

答案 0 :(得分:3)

否,%X的每个值都不可能引用不同的数组,而同时都引用同一数组。

如果您希望%X的每个值都是对同一数组的引用,请继续在循环外部分配一个数组。

如果您希望%X的每个值引用不同的数组,则需要为循环中的每个遍历分配一个新的数组。这可以是一个命名的(使用my创建),也可以是一个匿名的(使用[ ]创建)。


如果您只想使用外部@l中的值,以便每个引用的数组最初都具有相同的值,则可以使用

my @a = @l;
$X{$i} = \@l;

$X{$i} = [ @l ];