推送到数组引用
Posted
技术标签:
【中文标题】推送到数组引用【英文标题】:Push to array reference 【发布时间】:2011-03-04 13:06:40 【问题描述】:是否可以push
到 Perl 中的数组引用?谷歌搜索建议我首先尊重数组,但这并没有真正起作用。它推送到被引用的数组,而不是被引用的数组。
例如,
my @a = ();
my $a_ref = [@a];
push(@$a_ref,"hello");
print $a[0];
@a
将不会更新,并且此代码将失败,因为数组仍然为空
(我还在学习 Perl 引用,所以这可能是一个非常简单的问题。抱歉,如果是这样)
【问题讨论】:
my $a_ref = \@a;
- 你创建了一个新的 array_references,第一个元素是空数组 -> 所以只是一个空数组。
$a_ref = [@a];
没有引用原始的@a
-- 它复制了它的内容。
【参考方案1】:
$a
不是$a_ref
,($a
是给sort
的第一个比较变量,$a[0]
是@a
数组的第0 个元素)。切勿使用$a
,或 $b
在自定义排序子例程之外,@a
和 @b
数组也应该避免使用(有很多更好的选择)...
您所做的是分配给$a_ref
,一个匿名数组,然后将"hello"
推入它,但打印出@a
数组的第一个元素。
【讨论】:
【参考方案2】:考虑内存地址而不是变量名可能会有所帮助。
my @a = (); # Set aside memory address 123 for a list.
my $a_ref = [@a]; # Square brackets set aside memory address 456.
# @a COPIES the stuff from address 123 to 456.
push(@$a_ref,"hello"); # Push a string into address 456.
print $a[0]; # Print address 123.
字符串进入了不同的内存位置。
相反,将$a_ref
变量指向列表@a
的内存位置。 push
影响内存位置 123。由于@a
也引用内存位置 123,因此其值也会发生变化。
my $a_ref = \@a; # Point $a_ref to address 123.
push(@$a_ref,"hello"); # Push a string into address 123.
print $a[0]; # Print address 123.
【讨论】:
很好的解释。但是您可以使用至少在某些更深层次的 perl 使用的术语,并指出[...]
是一个 constructor 表达式。
注意:当您将数组引用传递给 push(至少使用现代 Perl)时,您不必取消引用数组引用。但我想 Perl 在这两种情况下的表现是一样的。
使用推送时取消引用不会创建数组的副本吗?【参考方案3】:
是的,这是可能的。这对我有用。
my @a = ();
my $aref = \@a; # creates a reference to the array a
push(@$aref, "somevalue"); # dereference $aref and push somevalue in it
print $a[0]; # print the just pushed value, again @$aref[0] should also work
如前所述,$aref = [@a]
将复制而不是创建对
【讨论】:
【参考方案4】:您可以直接推送到数组 ref 而无需延迟。
my $arrayRef = [];
push $arrayRef, "one";
push $arrayRef, "two";
print @$arrayRef;
输出
onetwo
文档:http://perldoc.perl.org/functions/push.html
从 Perl 5.14 开始,push 可以采用标量 EXPR,它必须保持 对 unblessed 数组的引用。
在 5.14 之前,您必须首先取消对数组 ref 的引用。
push @$arrayRef, "item";
编辑:Annnnd 直接推送到数组 ref 在最近的 perl 版本(5.24?)中已被弃用。鉴于此,在推动提高代码兼容性之前始终取消引用 @$arrayRef 会更安全。
【讨论】:
push
on references 实际上在 Perl 5.24 中被完全删除。
是的,你会得到一个Experimental push on scalar is now forbidden
以上是关于推送到数组引用的主要内容,如果未能解决你的问题,请参考以下文章