推送到数组引用

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

以上是关于推送到数组引用的主要内容,如果未能解决你的问题,请参考以下文章

如何推送对象值而不是数组中对象的引用

如何将某个函数推送到返回数组的函数?(是否可以推送到返回数组的函数)[关闭]

比较两个数组并将不同的值推送到新数组[重复]

JavaScript 推送到数组

如何设置状态并推送到数组?

猫鼬推送到数组