【问题标题】:Perl concept dynamic reference to an arrayPerl 概念动态引用数组
【发布时间】:2013-05-29 02:00:11
【问题描述】:

我试图在 Perl 中理解普通数组引用之间的区别 \@array 和 [@array]。

在下面的文章http://perl-begin.org/tutorials/perl-for-newbies/part2/ 中进行了介绍,它说 “被方括号 ([ @array ]) 包围的数组返回对数组的动态引用。此引用不会直接影响其他值,这就是它被称为动态的原因。”
上面的最后一句话说引用不直接影响其他值我不清楚,他们指的是什么其他值?一些网站复制并粘贴了相同的解释。有人可以提供更好的解释来突出差异吗?

这是他们提供的一个例子:

use strict;
use warnings;

sub vector_sum
{
    my $v1_ref = shift;
    my $v2_ref = shift;

    my @ret;

    my @v1 = @{$v1_ref};
    my @v2 = @{$v2_ref};

    if (scalar(@v1) != scalar(@v2))
    {
        return undef;
    }
    for(my $i=0;$i<scalar(@v1);$i++)
    {
        push @ret, ($v1[$i] + $v2[$i]);
    }

    return [ @ret ];
}

my $ret = vector_sum(
    [ 5, 9, 24, 30 ],
    [ 8, 2, 10, 20 ]
);

print join(", ", @{$ret}), "\n";

但是,在上面给出的示例中,如果我更改 return [ @ret ];到 \@ret,程序返回相同的结果,所以我不确定这是如何作为示例来说明动态引用的。

谢谢。

【问题讨论】:

    标签: arrays perl dynamic reference


    【解决方案1】:

    我质疑那个教程。当 perl 文档使用术语“动态”时,它们几乎总是指变量范围。您不会在 perlrefperlreftut 中找到“动态数组引用”的考虑。

    也就是说:

    \@array   # reference to @array
    [@array]  # reference to an unnamed *copy* of @array
    

    考虑当我们引用或引用@ARGV 的副本时会发生什么:

    $ perl -E '$a = \@ARGV; $a->[0] = "FOO"; say for @ARGV' blah blah
    FOO
    blah
    
    $ perl -E '$a = [@ARGV]; $a->[0] = "FOO"; say for @ARGV' blah blah
    blah
    blah
    

    【讨论】:

      【解决方案2】:

      我试图在 Perl 中理解普通数组引用 \@array[@array] 之间的区别。

      它们都是完全相同的引用类型;它们只是产生对不同数组的引用。

      [ ... ]
      

      基本一样
      do { my @anon = (...); \@anon }
      

      所以

      my @abc = qw( a b c );
      my $ref1 = \@abc;
      my $ref2 = [ @abc ];
      say @$ref1, @$ref2;  # abcabc
      @abc = qw( d e f );
      say @$ref1, @$ref2;  # defabc
      

      “这个引用不直接影响其他值,所以才叫动态。”

      它不叫“动态”,这不是我遇到过的动态定义。

      【讨论】:

        【解决方案3】:

        只是一个简单的说明:

        my @array = (2, 3, 5, 6);
        my $ref = \@array;
        my $dynamic_ref = [@array];
        
        print q{$array[1] = }, $array[1], "\n";
        print q{$ref->[1] = }, $ref->[1], "\n";
        print q{$dynamic_ref->[1] = }, $dynamic_ref->[1], "\n";
        
        $array[1] = 10;
        print "=" x 20, "\n";
        
        print q{$array[1] = }, $array[1], "\n";
        print q{$ref->[1] = }, $ref->[1], "\n";
        print q{$dynamic_ref->[1] = }, $dynamic_ref->[1], "\n";
        

        换句话说,您有一个对原始数组副本的引用,并且对原始数组的所有更改都不会影响此副本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-24
          • 2016-07-06
          相关资源
          最近更新 更多