$$ in perl 子程序定义

$$ in perl subroutine definition

这可能是一个重复的问题。 我知道 perl 不会限制用户使用参数及其类型。 但是 $,$$ 和 ; 是什么意思?在下面的代码中代表。

sub run($$;$) {
    my ( $x, $y, $z ) = @_;
....
}

这是一个 prototype。一个高级的 perl 功能,通常不是一个好主意。它允许您指定对子例程参数的约束。

在上面的例子中,它指定这个子程序接受两个强制标量参数和一个可选标量。

例如:

use strict;
use warnings;

sub with_proto($$;$) {
    print @_;
}

with_proto("A");
with_proto("A","B");
with_proto("A","B","C");
with_proto("A","B","C","D");

错误:

Not enough arguments for main::with_proto, line 9, near ""A")"
Too many arguments for main::with_proto, line 12, near ""D")"

不过请注意 - 这也会出错:

my @args = ( "A", "B", "C" );
with_proto(@args);

因为尽管列表中有 3 个元素,但原型显示 'scalars'。

with_proto(@args, "A", "B");

将打印:

3AB

因为原型说 'scalar' 它在标量上下文中需要 @args。如果你像 this:

sub without_proto {
    print @_;
}

my @args = ( "A", "B", "C" );
without_proto (@args, "A", "B");

你会得到 "ABCAB"。

所以充其量,它是一个功能,并不像看起来那么清晰,并且与您在其他语言中可能知道的 "prototypes" 并不特别相似。