不吐口水的签名
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:您不能用签名替换原型,因为它们是不同的东西。
这是一个关于已经有效的代码的问题!我有很多子程序将多个数组作为输入,例如:
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:您不能用签名替换原型,因为它们是不同的东西。