我可以在perl子原型中设置一个可选变量吗?
我想了解是否有可能有一个子原型和可选参数。使用原型,我可以做到这一点:我可以在perl子原型中设置一个可选变量吗?,perl,Perl,我想了解是否有可能有一个子原型和可选参数。使用原型,我可以做到这一点: sub some_sub (\@\@\@) { ... } my @foo = qw/a b c/; my @bar = qw/1 2 3/; my @baz = qw/X Y Z/; some_sub(@foo, @bar, @baz); 这很好,可读性也很好,但是当我尝试这样做的时候 some_sub(@foo, @bar); 甚至 some_sub(@foo, @bar, ()); 我发现错误: No
sub some_sub (\@\@\@) {
...
}
my @foo = qw/a b c/;
my @bar = qw/1 2 3/;
my @baz = qw/X Y Z/;
some_sub(@foo, @bar, @baz);
这很好,可读性也很好,但是当我尝试这样做的时候
some_sub(@foo, @bar);
甚至
some_sub(@foo, @bar, ());
我发现错误:
Not enough arguments for main::some_sub at tablify.pl line 72, near "@bar)"
或
有可能有一个原型和一个可变数量的参数吗?或者类似的事情可以通过签名实现
我知道这可以通过经常传递数组来实现。我想知道是否还有其他方法。毕竟,TMTOWTDI。分号后的所有参数都是可选的:
sub some_sub(\@\@;\@) {
}
大多数人会期望你的论点列表变得平淡,而你正在寻找一种过时的工具来做人们不期望的事情 而是通过引用传递数据结构:
some_sub( \@array1, \@array2 );
sub some_sub {
my @args = @_;
say "Array 1 has " . $args[0]->@* . " elements";
}
如果要将这些数组用作子对象中的命名数组,可以使用
使用v5.26,可以在参数内移动引用运算符:
use v5.26;
use experimental qw(declared_refs);
sub some_sub {
my( \@array1 ) = $_[0];
...
}
而且,请记住,v5.20引入了:prototype
属性,因此您可以区分原型和签名:
use v5.20;
sub some_sub :prototype(@@;@) { ... }
我在中写了这些东西(我知道你已经读过了),在中写了一点(这主要是关于你需要停止在Perl 5中做什么才能成为未来的证明)。你可以一起跳过原型。它们是可选的。@TLP-我的目标是避免将数组作为参数传递-请参阅(Ach!现在我在perlsub中找到了这一行。这和-供将来参考。但是,公平地说,您在中看到的是不应该这样做。:)
use v5.26;
use experimental qw(declared_refs);
sub some_sub {
my( \@array1 ) = $_[0];
...
}
use v5.20;
sub some_sub :prototype(@@;@) { ... }