4

我试图在 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,程序返回相同的结果,所以我不确定这是如何作为示例来说明动态引用的。

谢谢。

4

3 回答 3

5

我质疑那个教程。当 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
于 2013-05-29T02:06:11.753 回答
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

“这个引用不直接影响其他值,这就是为什么它被称为动态的。”

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

于 2013-05-29T02:05:45.280 回答
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";

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

于 2013-05-29T02:10:56.793 回答