gpt4 book ai didi

perl - 数组推送和引用

转载 作者:行者123 更新时间:2023-12-04 01:03:07 25 4
gpt4 key购买 nike

我是一个初学者 perl 程序员,我遇到了一段代码,如下所示:

my @Numbers=();

push(@{$Numbers[0]},3,8,9);
push(@{$Numbers[1]},5);

print join(",",@{$Numbers[0]});
print "\n";

print join(",",@{$Numbers[1]});
print "\n";

我很难理解推送到 @{$Numbers[0]}@{$Numbers[1]} 是做什么的。推送是否会在 Numbers 数组中自动创建对 [3,8,9][5] 的数组引用?我不难理解下面的语法,我想这更常见,但我没有遇到我在上面粘贴的语法,我猜它也使用自动激活来填充带有引用的 Numbers 数组。

my @Numbers=();

push(@Numbers,[3,8,9]);
push(@Numbers,[5]);

print join(",",@{$Numbers[0]});
print "\n";

print join(",",@{$Numbers[1]});
print "\n";

最佳答案

有两个特征在起作用,其中一个确实是 autovivification .


我将在一秒钟内进入自动激活。首先,让我们考虑一下当我们访问 $Numbers[0]@Numbers 为空的事实。这不是问题。 Perl 将自动扩展数组以包含此元素。[1]

my @a;
$a[3] = 123; # ok!
print(Dumper(\@a)); # [ undef, undef, undef, 123 ]

这不是文档中所说的 autovivification,但它非常相似,以至于有些人也将其称为 autovivification。


正如我提到的,第二个功能确实是自动生成。 Autovivification 是通过取消引用自动创建匿名变量。具体来说,它发生在取消引用未定义的标量时。[2]

在这种情况下,自动生成会创建一个数组,因为 @BLOCK 是一个数组解引用。对该数组的引用被创建并存储在以前的 undef 标量中。

换句话说,自动生成

push @{ $ref }, LIST;

有效地等同于

push @{ $ref //= [] }, LIST;

if (!defined($ref)) {
my @anon;
$ref = \@anon;
}

push @$ref, LIST;

这可能只是该问题的人为示例,但请注意,发布的代码很奇怪。我们知道 $Numbers[0]$Numbers[1] 是 undef,所以我们不需要 push

my @nums;
@{ $nums[0] } = ( 3, 8, 9 ); # Also autovivification.
@{ $nums[1] } = 5;

因为我们知道 $Numbers[0]$Numbers[1] 是 undef,所以我们也没有必要依赖自动生成。

my @nums;
$nums[0] = [ 3, 8, 9 ];
$nums[1] = [ 5 ];

让我们摆脱那些硬编码的索引。

my @nums;
push @nums, [ 3, 8, 9 ];
push @nums, [ 5 ];

最后的简化。

my @nums = (
[ 3, 8, 9 ],
[ 5 ],
);

  1. 这只发生在左值上下文中,这意味着当引用的变量预期被修改/可修改时。 say $a[@a]; 不会扩展数组,即使它访问最后一个元素之后的元素也是如此。

  2. 它还必须处于左值上下文中。 my @copy = @{ $undef }; 不会自动生成。

关于perl - 数组推送和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67498606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com