Arrays Perl概念对数组的动态引用

Arrays Perl概念对数组的动态引用,arrays,perl,dynamic,reference,Arrays,Perl,Dynamic,Reference,我试图在Perl中理解普通数组引用之间的区别 \@数组和[@array] 在下面的文章中,它说 “被方括号([@array])包围的数组返回对数组的动态引用。此引用不会直接影响其他值,因此称为动态引用。” 上面的最后一句话说引用不会直接影响其他值,我不清楚,它们引用的是什么其他值?一些网站复制并粘贴了相同的解释。有人能提供更好的解释来突出这些差异吗 以下是他们提供的一个示例: use strict; use warnings; sub vector_sum { my $v1_ref =

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

在下面的文章中,它说 “被方括号([@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";
使用严格;
使用警告;
子向量_和
{
我的$v1\u ref=班次;
我的$v2\u ref=班次;
我的@ret;
我的@v1=@{$v1_ref};
my@v2=@{$v2_ref};
if(标量(@v1)!=标量(@v2))
{
返回未定义;
}
对于(我的$i=0;$i
我试图在Perl中理解普通数组引用
\@array
[@array]
之间的区别

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

[ ... ]
基本上和

do { my @anon = (...); \@anon }
所以


此引用不会直接影响其他值,因此称为“动态”


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

我对该教程提出质疑。当perl文档使用术语“动态”时,它们几乎总是指变量范围。在nor中,您不会发现“动态arrayref”的考虑

也就是说:

\@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

仅举一个简单的例子:

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";
换句话说,您对原始数组的副本有一个引用,对原始数组的所有更改都不会影响此副本

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