为什么这些代码块的行为不同?
Why do these blocks of code behave differently?
我是 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";
}
在第一个示例中,您使用引用获取数组,然后对其进行修改。数组只有一个,你改一下。
在第二个示例中,您使用引用获取数组,然后您将数组的内容复制到第二个数组中,然后您修改第二个数组。有两个数组,你永远不会改变原来的一个。
我是 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";
}
在第一个示例中,您使用引用获取数组,然后对其进行修改。数组只有一个,你改一下。
在第二个示例中,您使用引用获取数组,然后您将数组的内容复制到第二个数组中,然后您修改第二个数组。有两个数组,你永远不会改变原来的一个。