2016-09-21 2 views
8

pour un sous-programme Perl, si passer 0 argument, je peux utiliser 4 formes pour l'appeler. Mais si le passage 1 ou plusieurs arguments, il y a une forme que je ne peux pas utiliser, s'il vous plaît voir ci-dessous:pourquoi la syntaxe `& nom arg1 arg2 ...` ne peut pas être utilisée pour appeler un sous-programme Perl?

sub name 
{ 
    print "hello\n"; 
} 
# 4 forms to call 
name; 
&name; 
name(); 
&name(); 

sub aname 
{ 
     print "@_\n"; 
} 
aname "arg1", "arg2"; 
#&aname "arg1", "arg2"; # syntax error 
aname("arg1", "arg2"); 
&aname("arg1", "arg2"); 

La sortie d'erreur est

String found where operator expected at tmp1.pl line 16, near "&aname "arg1"" 
    (Missing operator before "arg1"?) 
syntax error at tmp1.pl line 16, near "&aname "arg1"" 
Execution of tmp1.pl aborted due to compilation errors. 

Quelqu'un peut-il expliquer la sortie d'erreur du compilateur de point de vue? Je ne comprends pas pourquoi il se plaint de l'opérateur manquant.

Merci

+3

Vous avez une bonne réponse. Pour plus de discussion sur l'utilisation de '&' pour cela, voir ['this post'] (http://stackoverflow.com/questions/1347396/when-should-i-use-the-to-call-a- perl-subroutine), et ['this post'] (http://stackoverflow.com/questions/8912049/difference-between-function-and-function-in-perl), et [' this post'] (http: //stackoverflow.com/questions/6706882/using-ampersands-and-parens-when-calling-a-perl-sub) ... et il y en a probablement d'autres. – zdim

+1

@zdim je me demandais juste, pourquoi avez-vous mis les liens dans le code de balisage? – simbabque

+0

@simbabque Hah, bon point. Je suppose qu'ils sont plus visibles, mis en évidence. Je ne sais pas vraiment. Je n'y ai jamais vraiment pensé comme du «code balistique» (vous avez raison, c'est vrai) - mais plutôt comme du surlignage. – zdim

Répondre

13

Il est documenté dans perlsub:

Pour appeler les sous-routines:

 NAME(LIST); # & is optional with parentheses. 
     NAME LIST;  # Parentheses optional if predeclared/imported. 
     &NAME(LIST); # Circumvent prototypes. 
     &NAME;   # Makes current @_ visible to called subroutine. 

Avec &NAME "arg", perl voit &NAME() "ARG", il pense qu'il ya un opérateur manquant entre les sous appel et "ARG".

En Perl 5, vous n'avez pas besoin de & dans la plupart des cas.