我试图在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,程序返回相同的结果,所以我不确定这是如何作为一个例子来说明动态参考。
感谢。
答案 0 :(得分:5)
我质疑那个教程。当perl文档使用术语&#34; dynamic&#34;时,它们几乎总是指变量范围。你不会发现对动态阵列的考虑。在perlref和perlreftut。
那说:
\@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";
换句话说,您对原始数组的副本有引用,对原始数组的所有更改都不会影响此副本。