Abh*_*Das 3 arrays perl subroutine
我需要一个子程序,它完全消除的阵列元件在适当位置.以下代码失败:
sub del
{
splice(@_,2,1);
}
@array=(0..5);
print "@array"."\n";
del(@array);
print "@array"."\n";
Run Code Online (Sandbox Code Playgroud)
再次打印相同的阵列,即元素尚未被移除.但是,如果我splice()在程序的主体中使用而不是调用子例程,它就可以工作.
Sch*_*ern 14
虽然标量元素的@_别名是传入的数据,但@_它本身是一个不同的变量.这意味着$_[1] = "foo"会改变$_[1]但push @_, "foo"不会改变@_.否则my $self = shift将是一件坏事.
您需要传入数组作为参考.
sub del {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del \@array;
Run Code Online (Sandbox Code Playgroud)
如果你绝对必须保留del @array界面,这是少数几个适合使用原型的地方之一.
sub del(\@) {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del @array;
Run Code Online (Sandbox Code Playgroud)
该\@原型告诉Perl传递@array引用.我建议不要这样做有两个原因.首先,原型有一堆警告,这使他们不值得麻烦.
更重要的是,它会使del修改其参数变得非常明显.通常用户定义的Perl函数会复制它们的参数,因此您可以查看foo @array并合理地确定@array不会被更改foo.这使得人们可以快速浏览代码以处理将影响变量的事物.参考原型将其抛出窗口.现在必须检查每个函数是否存在可能隐藏的引用传递.