Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在perl子原型中设置一个可选变量吗?_Perl - Fatal编程技术网

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