2010-10-26 4 views
4

Le code suivant est extrait directement de la source du module Tie :: File. Que remplissent les parenthèses vides dans la définition de O_ACCMODE dans ce contexte? Je sais à quoi servent les prototypes de sous-programmes, mais cet usage ne semble pas s'y rapporter.Que fait() dans une définition de sous-routine en Perl?

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

Répondre

11

De perlsub sur le thème des fonctions constantes:

fonctions avec un prototype de() sont candidats potentiels pour inline

7

Le prototype de () rend la sous-routine admissible à l'inlining. Ceci est utilisé par le pragma constant, par exemple.

Voir Constant Functions dans perlsub.

12

Il indique également que l'analyseur O_ACCMODE ne prend pas argument sous n'importe quelle condition (excepté &O_ACCMODE() que vous n'aurez probablement jamais à penser). Cela le fait se comporter comme la plupart des gens s'attendent à une constante.

Comme un exemple rapide, dans:

sub FOO { 1 } 
sub BAR { 2 } 

print FOO + BAR; 

la dernière ligne parse comme print FOO(+BAR()) et la valeur imprimée est 1, parce que quand un sous prototypeless est appelée sans parens il essaie d'agir comme un terme de listop et Slurp aussi loin que possible.

Dans:

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

print FOO + BAR; 

La dernière ligne parse comme print FOO() + BAR() et la valeur imprimée est 3, car le prototype () indique à l'analyseur qu'aucun argument à FOO sont attendus ou valides.

+1

merci pour cela! très instructif! – ennuikiller