不吐口水的签名

Signature without slurping

这是一个关于已经有效的代码的问题!我有很多子程序将多个数组作为输入,例如:

use 5.24.0;
use feature 'refaliasing';
no warnings "experimental::refaliasing";
my (@foo,@bar,@baz);
sub sumarr (\@\@);

# other code to load arrays

sub sumarr (\@\@)
  { my (@sum, @aa, @ab);
    (\@aa,\@ab)=@_;
    $sum[$_] = $aa[$_] + $ab[$_] for 0 .. $#aa;
    return @sum;
    }

...我可以简单地调用

@baz = sumarr( @foo, @bar);

我还没有找到任何方法来用签名替换原型,或者至少用签名来扩充原型以简化参数列表。有什么东西可以做到这一点吗?

签名将 @_ 解压到函数内的词法变量中。原型会影响函数调用的解析方式。所以他们做不同的事情——你不能只用一个替换另一个。 (不过你可以编写一个兼具两者的函数。)

影响解析的原型说明。

use strict;
use warnings;
use Data::Dumper;

my @a = ( 1 );
my @b = ( 2 );

myfunc( @a, @b );

sub myfunc (\@\@) {
    print Dumper( @_ );
}

myfunc( @a, @b );

请注意 myfunc 使用相同的参数被调用两次,但产生不同的输出。使用 use warnings,Perl 至少会警告您您正在做一些可能很奇怪的事情。

正如我提到的,可以为同一函数同时声明签名和原型。

sub myfunc ( $A, $B ) :prototype(\@\@) {
    print Dumper( @_ );
}

(签名仍处于实验阶段,我相信他们最近确实调换了声明签名和原型的顺序!这是提防实验性功能的一个原因。)

TLDR:您不能用签名替换原型,因为它们是不同的东西。