为什么这些代码块的行为有所不同?

时间:2015-02-04 14:27:46

标签: perl pass-by-reference subroutine pass-by-value pass-by-pointer

我是Perl的新手,我无法弄清楚这一点。我有两组看似相同的代码,但是一个子程序更新了值而另一个没有。在第一组代码中,我的理解是传递对数组的引用,然后更新该引用指向的值。然后在离开子例程时,值已更改。但是,在第二个中,我希望发生同样的事情。它会更新数组,但在离开子程序后会忘记它。有人可以用第二套代码向我解释幕后发生的事情吗?

第一个代码集:

#!/usr/bin/perl -w

use strict;

{
    my @array = (1, 2, 3);
    removeSecondElement(\@array);
    print @array;  #output: 13
    print("\n");
}

sub removeSecondElement{
    my ($arrayReference) = @_;
    splice(@$arrayReference, 1, 1);
    print @$arrayReference;  #output: 13
    print "\n";
}

第二代码集:

#!/usr/bin/perl -w

use strict;

{
    my @array = (1, 2, 3);
    removeSecondElement(\@array);
    print @array;  #output: 123
    print("\n");
}

sub removeSecondElement{
    my ($arrayReference) = @_;
    my @array = @$arrayReference;
    splice(@array, 1, 1);
    print @array;  #output: 13
    print "\n";
}

1 个答案:

答案 0 :(得分:7)

在第一个示例中,您使用引用来获取数组,然后修改它。只有一个数组,你可以改变它。

在第二个示例中,您使用引用来获取数组,然后将数组的内容复制到第二个数组,然后修改第二个数组。有两个数组,你永远不会改变原来的数组。