代码之家  ›  专栏  ›  技术社区  ›  Mike

推到数组引用

  •  29
  • Mike  · 技术社区  · 14 年前

    可以吗 push Perl中的数组引用?谷歌建议我先尊重阵列,但这并不是真的有效。它将推送到延迟的数组,而不是引用的数组。

    例如,

    my @a = ();
    
    my $a_ref = [@a];
    
    push(@$a_ref,"hello");
    
    print $a[0];
    

    @a 将不更新,此代码将失败,因为数组仍为空

    (我仍然在学习Perl引用,所以这可能是一个非常简单的问题。对不起,如果是这样)

    4 回复  |  直到 8 年前
        1
  •  45
  •   Robert Wohlfarth    14 年前

    用内存地址而不是变量名来思考可能会有所帮助。

    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。自从 @ 也指内存位置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.
    
        2
  •  7
  •   Despertar    8 年前

    您可以直接推送到数组引用上而不延迟。

    my $arrayRef = [];
    push $arrayRef, "one";
    push $arrayRef, "two";
    print @$arrayRef;
    

    输出

    onetwo
    

    文档: http://perldoc.perl.org/functions/push.html

    从Perl5.14开始,push可以接受一个标量expr,它必须保持 对无抵押数组的引用。

    pre 5.14必须先取消对数组引用的引用。

    push @$arrayRef, "item";
    

    编辑:在最近的Perl版本(5.24?)中,不赞成将annnnd直接推送到array-ref。。考虑到这一点,在推动提高代码的兼容性之前,总是取消对@$arrayref的引用会更安全。

        3
  •  3
  •   Evan Carroll    14 年前

    $a 不是 $a_ref , $A 是第一个比较变量 sort{} $a[0] 是的第0个元素 @a 数组)。不要使用 $A $b 在自定义排序子例程的外部,以及 @ @b 数组也应该避免(有很多更好的选择)。

    你要做的是分配给 阿雷夫 ,一个匿名数组,然后推到它上面 "hello" ,但打印出 @ 数组。

        4
  •  1
  •   neal aise    14 年前

    是的,这是可能的。这对我有用。

    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] 将复制但不创建对