2015-10-14 61 views
4

我得到了下面的代码:

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

谁能告诉我什么$;$手段?

回答

10

子声明后面括号中的内容称为原型。他们在perlsub解释。一般来说,你可以用可以来限制编译时参数检查。

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

分号(;)将可选参数与可选参数分隔开。它之前@或%,这吞噬一切

所以在这里,子必须与至少有一个参数被调用,但可能有第二个是多余的。

如果您使用三个参数调用它,它将引发错误。

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及其答案,以获得有关该主题的详细解释和讨论。

+4

他们被认为是不好的练习的部分原因是“prototype”这个词。在其他编程语言中,它意味着别的东西。 – Sobrique

+0

这很有帮助。非常感谢! –

+1

他们被认为是不好的做法最重要的原因是那些不知道自己在做什么的人正试图将他们用于某些他们不知道的事情。 (他们是电动工具;请阅读手册,除非你是这个意思,否则不要使用它们。) –