Perl:使用子例程的splice()数组

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.这使得人们可以快速浏览代码以处理将影响变量的事物.参考原型将其抛出窗口.现在必须检查每个函数是否存在可能隐藏的引用传递.