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

enn*_*ler 4 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 }
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 12

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

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

sub FOO { 1 }
sub BAR { 2 }

print FOO + BAR;
Run Code Online (Sandbox Code Playgroud)

最后一行解析为,print FOO(+BAR())并且打印的值为1,因为当没有parens调用无原型子时,它会尽可能地像listop和slurp一样行动.

在:

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

print FOO + BAR;
Run Code Online (Sandbox Code Playgroud)

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


FMc*_*FMc 11

来自perlsub关于常量函数的主题:

具有()原型的函数是内联的潜在候选者


Eug*_*ash 7

原型()使子程序有资格进行内联.constant例如,pragma 使用它.

请参阅perlsub中的常量函数.