Perl:命名变量的作用域和分配

Perl:命名变量的作用域和分配,perl,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 (@{$

这是一个小样本

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 $_;
    }
}
如果我为赋值使用一个局部变量,它将产生相同的输出-没关系! 列表的内存总是被重新分配而不是被覆盖,因为@l总是新的。%X中仍然有对它的引用,因此不可能发布(或者perl中的内存管理工作正常-我不知道)


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

否,
%X
的每个值都不可能是对不同数组的引用,同时所有值都是对同一数组的引用

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

如果希望
%X
的每个值都是对不同数组的引用,则需要为循环的每次传递分配一个新数组。它可以是命名的(使用
my
创建),也可以是匿名的(使用
[]
创建)


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

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


否,
%X
的每个值都不可能是对不同数组的引用,同时所有值都是对同一数组的引用

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

如果希望
%X
的每个值都是对不同数组的引用,则需要为循环的每次传递分配一个新数组。它可以是命名的(使用
my
创建),也可以是匿名的(使用
[]
创建)


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

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


$X{$i}=[@l]
如果存储对数组的引用,则引用保持不变。
@{$X{$i}=@l
也会起作用。
@{$X{$i}=@l
之所以有效,是因为它是
@{$X{$i}/=[]}=@l<代码>X{$i}=[@l]
更清晰。
$X{$i}=[@l]
如果存储对数组的引用,则引用保持不变。
{$X{$i}=@l
也会起作用。
@{$X{$i}=@l
之所以有效,是因为它是
@{$X{$i}/=[]}=@l<代码>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
my @a = @l;
$X{$i} = \@l;
$X{$i} = [ @l ];