2013-12-21 64 views
0
1) sub name() {....} 

2) sub name {....} 

3) sub name ($j,$j) {.....} 

这三个是在Perl中声明子程序的不同方法。想知道它们之间的区别。

+1

[的perldoc perlsub](http://perldoc.perl.org/perlsub.html) – squiguy

+3

原型在[的perldoc perlsub](http://perldoc.perl.org/perlsub。HTML#原型)。 '3)'无效:'perl -we'子名($ j,$ j){}'' –

回答

5

Perl有一个名为的原型,它改变了编译时如何解析该子例程的调用。此功能对声明参数列表没有用处。原型非常有限,必须在调用子之前进行声明。

  • sub name()声明,本次不带任何参数。用参数调用该子文件是编译错误:name(1)Too many arguments for main::name中止。如果您在声明它之前调用该子项,则会收到一个可选的main::name() called too early to check prototype警告。

  • sub name是没有任何原型的常规形式,您应该始终使用它。它被等效地解析为原型(@)

  • sub name($i, $j)是一个编译错误:Illegal character in prototype for main::name。原型子语言中允许的唯一字符为:

    • $标量上下文。在参考规范中:标量
    • @列表上下文,slurpy。在参考规范中:array
    • % list context,slurpy。在参考规范中:hash
    • * glob或事物强制为一个glob
    • &子例程。在初始位置:裸码块
    • _标量或$_
    • +收集参考。打破对象。的必需的参数
    • ;x类型的
    • \x参考其中x是$%@*&
    • \[…],可以是任何类型的在括号的参考。

    在Perl中,参数通过@_数组传递,并在子例程内解压缩为my ($i, $j) = @_。原型与此无关。

    然而,有一些语法扩展劫持该位置来声明参数(而不是原型)。通过signatures,可以使用sub foo($x, $y)等声明。其他模块如Function::ParametersKavorka会引入新的关键字(funcfun),并允许其他功能,如类型,约束,关键字参数等。