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

Perl 为什么这些代码块的行为不同?,perl,pass-by-reference,subroutine,pass-by-value,pass-by-pointer,Perl,Pass By Reference,Subroutine,Pass By Value,Pass By Pointer,我是Perl新手,我无法理解这一点。我有两组看似相同的代码,但一个子例程更新值,而另一个子例程不更新值。在第一组代码中,我的理解是传递对数组的引用,然后更新引用所指向的值。然后,当离开子例程时,该值已更改。然而,在第二个例子中,我预计同样的事情也会发生。它确实会更新数组,但在离开子例程后会忘记它。有人能给我解释一下第二套代码的幕后情况吗 第一个代码集: #!/usr/bin/perl -w use strict; { my @array = (1, 2, 3); remove

我是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";
}
第二个代码集:

#!/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";
}

在第一个示例中,使用引用获取数组,然后对其进行修改。只有一个数组,您可以更改它


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

在保留该赋值的同时,有没有办法使第二组代码按照我预期的方式运行?例如my@array=\@$arrayReference;?尽管那行不通。如果您不知道的话,我对Perl是新手:-也就是说,有没有办法使子例程中的@array指向$arrayReference指向的同一个数组?@Evorlo,有两种方法。1我们的@别名;本地*别名=$ref;2使用数据::别名;别名my@array=@$ref;。但是说真的,要习惯使用引用。@Evorlo:我很高兴你有一个解决方案,但是请注意不要使用它的警告。创建别名是一种毫无意义的开销,许多人不会理解它。第一种方法使用全局变量,这是您应该尽可能避免的。在这里,直接使用参考资料而不是复制参考资料是很容易的。如果你真的不能做到这一点,我会按原样使用你的第二个代码,但添加@$arrayReference=@array;回来最后。顺便说一句,您的sub隐式地返回print返回的任何内容;您应该始终在sub的末尾使用显式返回,即使-尤其是-如果它不返回任何内容。