【问题标题】: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 -- 它复制了它的内容。

标签: perl arrays reference


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2015-02-16
      • 1970-01-01
      • 2013-05-19
      • 2020-05-12
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多