gpt4 book ai didi

arrays - Perl:如何在不创建数组副本的情况下取消引用数组?

转载 作者:行者123 更新时间:2023-12-03 18:19:14 25 4
gpt4 key购买 nike

当我使用 @$arrayRef 或 @{$arrayRef} 取消引用数组时,它似乎创建了该数组的副本。有没有正确的方法来取消引用数组?

这段代码...

sub updateArray1 {
my $aRef = shift;
my @a = @$aRef;
my $aRef2 = \@a;

$a[0] = 0;
push(@a, 3);
my $aRef3 = \@a;

print "inside1 \@a: @a\n";
print "inside1 \$aRef: $aRef\n";
print "inside1 \$aRef2: $aRef2\n";
print "inside1 \$aRef3: $aRef3\n\n";
}

my @array = (1, 2);

print "before: @array\n";
my $ar = \@array;
print "before: $ar\n\n";

updateArray1(\@array);

print "after: @array\n";
$ar = \@array;
print "after: $ar\n\n";

...有输出...
before: 1 2
before: ARRAY(0x1601440)

inside1 @a: 0 2 3
inside1 $aRef: ARRAY(0x1601440)
inside1 $aRef2: ARRAY(0x30c1f08)
inside1 $aRef3: ARRAY(0x30c1f08)

after: 1 2
after: ARRAY(0x1601440)

如您所见,@$aRef 创建了一个新的指针地址。

我发现解决这个问题的唯一方法是只使用引用:
sub updateArray2 {
my $aRef = shift;

@$aRef[0] = 0;
push(@$aRef, 3);

print "inside2 \@\$aRef: @$aRef\n";
print "inside2 \$aRef: $aRef\n\n";
}

updateArray2(\@array);

print "after2: @array\n";
$ar = \@array;
print "after2: $ar\n\n";

产生输出:
inside2 @$aRef: 0 2 3
inside2 $aRef: ARRAY(0x1601440)

after2: 0 2 3
after2: ARRAY(0x1601440)

是否可以在不复制整个数组的情况下取消引用指向数组的指针?或者我是否需要将它保留在引用形式中并在我想使用它时取消引用它?

最佳答案

取消引用不会创建副本,如以下示例所示:

my @a = qw(a b c);
my $ra = \@a;
@{$ra}[0,1] = qw(foo bar); # dereferencing is done here but not copying
print @$ra; # foo bar c
print @a; # foo bar c

相反, 分配 (取消引用)数组到另一个数组 创建副本 :
my @a = qw(a b c);
my $ra = \@a;
my @newa = @$ra; # copy by assigning
$newa[0] = 'foo';
print @newa; # foo b c
print @a; # a b c

将一个数组分配给另一个数组本质上是说旧数组中的所有元素也应该分配给新数组 - 这与只是为原始数组使用不同的名称不同。但是将一个数组引用分配给另一个只会使旧数组具有不同的名称,即复制数组引用与复制数组内容。

请注意,这似乎与 Python 或 Java 等语言不同,因为在这些语言中,变量仅描述数组对象,即对数组的引用而不是数组的内容。

关于arrays - Perl:如何在不创建数组副本的情况下取消引用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262376/

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