2010-10-26 68 views
4

以下代碼直接從Tie :: File模塊的源代碼中提取。在這種情況下,空括號在O_ACCMODE的定義中完成了什麼?我知道使用了哪些子程序原型,但這種用法似乎與此無關。()在Perl的子程序定義中完成了什麼?

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

回答

11

有原型的

功能()是 內聯

7

()的原型使得子程序有資格進行內聯。例如,這由constant編譯指示使用。

在perlsub中查看Constant Functions

perlsub上的功能不變的話題
12

潛在的候選人還告訴O_ACCMODE不採取解析器在除了&O_ACCMODE()之外的任何情況下都可能不需要考慮)。這使得它表現得像大多數人所期望的那樣。

作爲一個簡單的例子,在:

sub FOO { 1 } 
sub BAR { 2 } 

print FOO + BAR; 

最後一行解析作爲print FOO(+BAR())和打印的值是1,因爲當prototypeless子被不帶括號它試圖像一個listop和嘟嘟地喝術語儘可能地正確。

在:

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

print FOO + BAR; 

最後一行解析作爲print FOO() + BAR()和打印的值是3,這是因爲()原型告訴給FOO沒有參數被預期或有效的解析器。

+1

謝謝!非常翔實! – ennuikiller 2010-10-26 21:50:35

相關問題