()在Perl的子例程定义中完成了什么?

时间:2010-10-26 12:28:52

标签: perl prototype definition subroutine

以下代码直接从Tie :: File模块的源代码中提取。在这种情况下,O_ACCMODE定义中空括号的作用是什么?我知道使用了什么子例程原型,但这种用法似乎与此无关。

use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY';
sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY }

3 个答案:

答案 0 :(得分:12)

它还告诉解析器O_ACCMODE在任何条件下都不接受参数(&O_ACCMODE()除外,您可能永远不必考虑)。这使得它的行为就像大多数人期望的一样。

作为一个简单的例子,在:

sub FOO { 1 }
sub BAR { 2 }

print FOO + BAR;

最后一行解析为print FOO(+BAR()),打印的值为1,因为当没有parens的情况下调用无原型子时,它会尝试尽可能地像listop和slurp term一样。

在:

sub FOO () { 1 }
sub BAR () { 2 }

print FOO + BAR;

最后一行解析为print FOO() + BAR(),打印的值为3,因为()原型告诉解析器没有预期或有效的FOO参数。

答案 1 :(得分:11)

关于常数函数主题的perlsub

  

原型为()的函数是   潜在的内联候选人

答案 2 :(得分:7)

()的原型使子程序有资格进行内联。例如,constant编译指示使用它。

请参阅perlsub中的Constant Functions