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;
};
我希望通过 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;
};