以下代码直接从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 }
答案 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。