Perl 5 签名:传递多个数组

Perl 5 signatures: Passing multiple arrays

我希望通过 Perl 5 中的签名功能(例如在 5.34.0 版中),这样的事情是可能的:

use feature qw{ say signatures };

&test(1, (2,3,4), 5, (6,7,8));

sub test :prototype($@$@) ($a, @b, $c, @d) {
    say "c=$c";
};

或者可能是这样:

sub test :prototype($\@$@) ($a, \@b, $c, @d) {
}

(此处建议:https://www.perlmonks.org/?node_id=11109414)。

但是,我无法做到这一点。我的问题是:使用签名功能,是否可以将多个数组传递给子程序?

或者:即使有签名,也是通过引用传递数组的唯一方法吗?也就是说:是否有任何替代方法可以通过引用传递,例如:

sub test($a, $b, $c, @d) {
  my @b = @{$b};
}

非常感谢!

(P.S.: 如果数组有解决方案,那么散列也有解决方案,所以我没有在上面详细说明。)

With the signatures feature, is it possible to pass more than one array to a subroutine?

是的,你可以这样做:

use v5.22.0;   # experimental signatures requires perl >= 5.22
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);

sub test :prototype($\@$\@) ($a, $b, $c, $d) {
    say "c=$c";
}

my @q  = (2,3,4);
my @r  = (6,7,8);
test(1, @q, 5, @r);

输出:

c=5

根据评论线程中的建议,在单独的答案中总结了一些想法:

Håkon Hægland 提出的解决方案

sub test :prototype($\@$\@) ($a, $b, $c, $d) {
    say "c=$c";
    say @$b;
}

my @q  = (2,3,4);
my @r  = (6,7,8);
test(1, @q, 5, @r);

通常的传递引用

请注意,这与传统的按引用传递不同:

my @q  = (2,3,4);
my @r  = (6,7,8);

sub test1 :prototype($$$$) ($a, $b, $c, $d) {
    say "c=$c";
    say @$b;
}

test1(1, \@q, 5, \@r);

Håkon 的解决方案具有验证的优势(并且意味着参数作为 @b 而不是 \@b 传递)。

改进 declared_refs

Diab Jerius 建议 declared_refs,它提供了替代语法:

use v5.22.0;
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures declared_refs);

sub test :prototype($\@$\@) ($a, $b, $c, $d) {
    say "c=$c";
    say @$b;
    my \@bb = $b;
    say @bb;
}

我(发帖人)所希望的。

我希望(主要是光学)这是可能的

sub test :prototype($@$@) ($a, @b, $c, @d) {
    say @b;
};