#!/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
标记的线是我的问题所在.标量$aref的值是对匿名数组的引用.在标记的行中我希望能够使数组变量@a引用该数组,但是会发生的是匿名数组被复制而@a指的是匿名数组的副本.赋值和打印语句显示了这一点.
我知道当你分配给一个数组时,赋值的右边是一个列表上下文,所以@ $aref被强制转换为它的元素列表.有没有办法将名称@a赋予$aref引用的数组?
解决方法
我想知道你为什么要这样做?我认为这是一个性能问题,但通常的解决方案是通过引用传递您的数据.将$aref-> [1]写为$a [1]同样容易
您可以通过分配typeglob在包符号表中为您的引用添加别名,但别名必须是包变量
use strict; use warnings; my $aref = [1,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,3]; alias_r $aref,\my @a; $a[1] = 99; print "aref = @$aref\n"; print "a = @a\n";
另一种方法是使用别名而不是alias_r
alias @$aref,my @a;