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 ];