我需要一个子程序来完全删除一个数组元素。以下代码失败:
sub del
{
splice(@_,2,1);
}
@array=(0..5);
print "@array"."\n";
del(@array);
print "@array"."\n";
再次打印相同的数组,即该元素尚未被删除。
但是,如果我使用
splice()
在程序的主体中而不是调用子程序,它可以工作。
最佳答案
而 @_
的标量元素是传入的数据的别名,@_
本身是一个不同的变量。这意味着 $_[1] = "foo"
将改变 $_[1]
但是 push @_, "foo"
不会改变@_
.否则 my $self = shift
将是一件坏事。
您需要传入数组作为引用。
sub del {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del \@array;
如果您绝对必须保留
del @array
接口(interface),这是为数不多的适合使用原型(prototype)的地方之一。sub del(\@) {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del @array;
\@
原型(prototype)告诉 Perl 传入 @array
引用。我建议不要这样做,原因有两个。首先,原型(prototype)有很多注意事项,使它们不值得麻烦。更重要的是,它使
del
变得不明显。将修改其参数。通常用户定义的 Perl 函数会复制它们的参数,所以你可以查看 foo @array
并且有理由确定@array
不会被 foo
改变.这使人们能够快速浏览代码以查找会影响变量的事物。引用原型(prototype)将其抛出窗外。现在必须检查每个函数是否存在可能的隐藏传递引用。
关于arrays - Perl:使用子程序的 splice() 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9590517/