4

以下代码直接取自 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 }
4

3 回答 3

12

它还告诉解析器O_ACCMODE在任何情况下都不接受参数(除非&O_ACCMODE()您可能永远不必考虑)。这使它表现得像大多数人期望的那样。

举个简单的例子,在:

sub FOO { 1 }
sub BAR { 2 }

print FOO + BAR;

最后一行解析为print FOO(+BAR()),打印的值为 1,因为当一个无原型的 sub 被调用时没有括号,它会尽可能地像一个 listop 和 slurp 术语一样工作。

在:

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

print FOO + BAR;

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

于 2010-10-26T16:32:33.077 回答
11

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

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

于 2010-10-26T12:34:18.310 回答
7

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

请参阅perlsub 中的常量函数

于 2010-10-26T12:34:00.043 回答