2015-07-13 45 views
6

究竟是什么区别(如果有的话)之间:和带有和不带圆括号的Perl子声明有什么区别?

sub foobar() { 
    # doing some stuff 
} 

sub foobar { 
    # doing some stuff 
} 

我看到一些各自的,并且第一语法有时编译失败。

+6

第一个原型说函数不带任何参数;第二个不是原型,也没有提出任何有关论据。使用第二种形式。参见[远远超过你想知道Perl中的原型](http://www.perlmonks.org/?node_id=861966)。 –

+2

在'5.20' *实验*函数签名中也使用parens,http://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/ –

回答

9

通过把()放在子程序名的末尾,你就给它一个原型。一个原型给Perl提示了你将要传递给子例程的参数的数量和类型。详情请参阅this section in perlsub

具体来说,()是一个空的原型,它告诉Perl该子程序不接受任何参数,如果你用参数调用该子程序,Perl将抛出一个编译错误。下面是一个例子:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

sub foo { 
    say 'In foo'; 
} 

sub bar() { 
    say 'In bar'; 
} 

foo(); 
bar(); 
foo(1); 
bar(1); 

输出从这个是:

Too many arguments for main::bar at ./foobar line 18, near "1)" 
Execution of ./foobar aborted due to compilation errors. 

它到bar()最后一次调用(具有1参数),这会导致此错误。

值得注意的是,Perl的原型实现通常不如人们经常认为的那样有用,并且除了一些特殊情况外,大多数Perl专家都会避免它们。我建议你也这样做。从Perl v5.22开始,实验性“签名”功能正在进行测试,希望能够完成其他语言的程序员从原型中期望获得的许多目标。

+0

“关于参数的数量和类型的提示”如果你阅读someones脚本,这是一个有价值的信息。将这些提示放在代码中是否值得?你能说出为什么大多数人会避免它吗? – Matthias

+4

Tom Christiansen [写道](http://www.perlmonks.org/?node_id=861966)比我想象的要好得多。 –

+1

@Matthias如果T.C.的P.M. post是TL; DR,你可以考虑perl的数组和散列类型的含糊性; 'foo($ a,$ b)'也可能是'foo(@args)'等等。之后,世界分裂成两个阵营,那些恐怖的人会逃跑并且远离语言他们可以,以及将其视为天才或运气的人。请记住它也是一种具有完善文档样式(POD)的语言,并且这可能被认为是*动态类型**语言的适当职责分离。 – delicateLatticeworkFever

相关问题