$; $在Perl函数定义中意味着什么?

时间:2015-10-14 12:50:36

标签: perl

我收到了以下代码:

sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }

有人能告诉我$;$的含义吗?

1 个答案:

答案 0 :(得分:10)

子声明后面括号中的内容称为 prototype 。它们在perlsub中有解释。通常,可以使用它们来限制编译时参数检查。

特定($;$)用于强制参数。

  

分号(;)将必需参数与可选参数分开。在@或%之前它是多余的,它吞噬了其他所有东西

所以在这里,必须使用至少一个参数来调用sub,但可能会有第二个

如果用三个参数调用它,就会抛出错误。

use constant _DR => 1;
sub rad2rad       {@_}
sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }

print deg2rad(2, 3, 4);

__END__

Too many arguments for main::deg2rad at scratch.pl line 409, near "4)"
Execution of scratch.pl aborted due to compilation errors.

请注意,原型不适用于$foo->frobnicate()等方法调用。

一般来说,原型在现代Perl中被认为是不好的做法,只有在您确切知道自己在做什么时才应该使用。

使用The Sidhekin in their comment below的简短方法总结得很好:

  

他们被认为是不良行为的最重要原因是   那些不确切知道自己在做什么的人正在尝试使用   他们为他们不是的东西。

有关该主题的详细解释和讨论,请参阅this question及其答案。