$$ in perl子例程定义

时间:2015-10-20 10:31:40

标签: perl legacy-code

这可能是一个重复的问题。 我知道perl并不限制用户没有参数及其类型。 但是$,$$和;代表以下代码。

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

1 个答案:

答案 0 :(得分:4)

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

在上面的例子中,它指定此子例程采用两个强制标量参数和一个可选标量。

E.g:

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个元素,但原型却说“标量”。

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

将打印:

3AB

因为原型说“标量”'它在标量上下文中需要@args。如果您完成了 this

,那么您可能会有所期待
sub without_proto {
    print @_;
}

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

你会得到" ABCAB"。

所以最好的情况是,这个功能并不像看起来那么清晰,并且与#34;原型"并不特别相似。你可能会用其他语言了解它们。