【问题标题】:Can I make a variable optional in a perl sub prototype?我可以在 perl 子原型中将变量设为可选吗?
【发布时间】:2021-03-31 14:15:56
【问题描述】:

我想了解是否可以在其中包含子原型可选参数。使用原型我可以做到这一点:

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)"

Type of arg 3 to main::some_sub must be array (not stub) at tablify.pl line 72, near "))"

是否可以有一个原型可变数量的参数?还是可以通过签名实现类似的东西?

我知道它可以通过总是传递 arrayrefs 来完成,我想知道是否还有其他方法。毕竟,TMTOWTDI。

【问题讨论】:

标签: perl


【解决方案1】:

分号后的所有参数都是可选的:

sub some_sub(\@\@;\@) {
}

【讨论】:

【解决方案2】:

大多数人都希望你的论点列表变平,而你正在寻找一个过时的工具来做人们意想不到的事情。

相反,通过引用传递数据结构:

some_sub( \@array1, \@array2 );

sub some_sub {
   my @args = @_;
   say "Array 1 has " . $args[0]->@* . " elements";
   }

如果你想在 sub 中使用它们作为命名数组,你可以使用ref aliasing

use v5.22;
use experimental qw(ref_aliasing);
sub some_sub {
    \my( @array1 ) = $_[0];
    ...
    }

在 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(@@;@) { ... }

我在The Effective Perler(你已经读过,我明白了)、Perl New FeaturesPreparing for Perl 7 写了一些关于这些事情的文章(主要是关于你需要停止在 Perl 5 中做的事情未来证明)。

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 2014-01-02
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多