arrays - Perl:使用子程序的 splice() 数组

标签 arrays perl subroutine

我需要一个子程序来完全删除一个数组元素。以下代码失败:

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/

相关文章:

perl - 如何在子程序名称中启用点 (.)?

python - Numpy 数组插入第二个数组中的每隔一个元素

javascript - 使用 toArray 时非法调用

perl - git svn rebase导致 “byte order is not compatible”错误

perl - 我们可以在 Perl 中同时运行两个非嵌套循环吗?

perl - 为什么 Net::Twitter 提示 "HTTP::Message content not bytes"?

batch-file - 从子程序中获取批处理文件名

perl - 如何调用在另一个包中声明的子例程而不在子例程名称前加上它的包名?

c - C语言中如何删除字符串中的特殊字符

c - 如何访问按值传递给函数的结构数组中的成员?