gpt4 book ai didi

arrays - 我可以在 Perl 中命名一个匿名数组吗?

转载 作者:行者123 更新时间:2023-12-04 16:39:01 27 4
gpt4 key购买 nike

#!/usr/bin/perl -w

use strict;

my $aref = [1, 2, 3];
my @a = @$aref; # this line
$a[1] = 99;
print "aref = @$aref\n";
print "a = @a\n";

产生输出:
aref = 1 2 3
a = 1 99 3

输出显示 @a@$aref不要引用同一个数组。

标记线是我的问题所在。标量值 $aref是对匿名数组的引用。在标记的行中,我希望能够使数组变量 @a引用该数组,但会发生匿名数组被复制和 @a指的是匿名数组的副本。赋值和打印语句显示了这一点。

我知道当您分配给一个数组时,分配的右侧是一个列表上下文,所以 @$aref被强制为其元素列表。有没有办法给名字 @a$aref 引用的数组?

最佳答案

我想知道你为什么要这样做?我认为这是一个性能问题,但通常的解决方案是通过引用传递您的数据。写 $aref->[1] 一样容易如$a[1]
您可以通过分配给 typeglob 来为包符号表中的引用设置别名,但别名必须是包变量

use strict;
use warnings;

my $aref = [1, 2, 3];

our @a;
*a = $aref;

$a[1] = 99;

print "aref = @$aref\n";
print "a = @a\n";

输出
aref = 1 99 3
a = 1 99 3

有许多模块提供了很好的语法并允许您为词法变量设置别名

这是一个使用 Lexical::Alias 的版本它具有别名词法变量的优点,并且可能比分配给 typeglobs 更健壮。 Data::Alias 以非常相似的方式工作。输出与上面相同
use strict;
use warnings;

use Lexical::Alias qw/ alias_r /;

my $aref = [1, 2, 3];

alias_r $aref, \my @a;

$a[1] = 99;

print "aref = @$aref\n";
print "a = @a\n";

另一种方法是使用 alias而不是 alias_r
alias @$aref, my @a;

关于arrays - 我可以在 Perl 中命名一个匿名数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705607/

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