Perl概念动态引用数组

时间:2013-05-29 02:00:12

标签: arrays perl dynamic reference

我试图在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";

但是,在上面给出的例子中,如果我改变了返回[@ret];到\ @ret,程序返回相同的结果,所以我不确定这是如何作为一个例子来说明动态参考。

感谢。

3 个答案:

答案 0 :(得分:5)

我质疑那个教程。当perl文档使用术语&#34; dynamic&#34;时,它们几乎总是指变量范围。你不会发现对动态阵列的考虑。在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

答案 1 :(得分: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

  

“此引用不会直接影响其他值,这就是它被称为动态的原因。”

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

答案 2 :(得分:0)

只是一个简单的例子:

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";

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