1)子名称(){....} 2)子名{....} 3)子名称($ j,$ j){.....}之间有什么区别

时间:2013-12-21 06:29:13

标签: perl

1) sub name() {....}  

2) sub name {....}  

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

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

1 个答案:

答案 0 :(得分:5)

Perl有一个名为 prototypes 的功能,它可以改变在编译时解析该子例程的调用的方式。此功能对声明参数列表没有用。原型非常有限,必须在调用sub之前声明。

  • sub name()声明此sub不带任何参数。使用参数调用该sub是一个编译错误: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。原型子语言中允许的唯一字符是:

    • $标量上下文。在referene规范:标量
    • @列出上下文,slurpy。在参考规范:array
    • %列出上下文,slurpy。在参考规范中:hash
    • * glob或者可以强化为glob的东西
    • &子程序。在初始位置:裸代码块
    • _标量或$_
    • +收集参考。打破对象。
    • ;所需参数的结尾
    • \x类型为x的引用,其中x为$%@*&
    • \[…]引用可以是括号中的任何类型。

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

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