以下代码直接取自 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 }
以下代码直接取自 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 }
它还告诉解析器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
是预期的或有效的。
来自perlsub关于常量函数的主题:
具有 () 原型的函数是内联的潜在候选者
的原型()
使子例程有资格进行内联。constant
例如,pragma 使用它。
请参阅perlsub 中的常量函数。