2010-03-04 6 views
7

Voici le code:Pourquoi une erreur de syntaxe se produit-elle lorsque je passe un coderef à ce sous-programme Perl prototypé?

sub function($&) { 
    my $param1 = shift; 
    my $code = shift; 
    # do something with $param1 and $code 
} 

Si je tente de l'appeler comme ceci:

function("whatever") { 
    print "i'm inside the coderef\n"; 
} 

Je reçois Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { ". Comment puis-je l'appeler sans avoir à ajouter sub devant le bloc de code?

Répondre

18

Mettez l'argument coderef premier:

sub function (&$) { 
    my $code = shift; 
    my $param1 = shift; 
    # do something with $param1 and $code 
} 

function { print "i'm inside the coderef\n" } "whatever"; 

Voir la page de manuel perlsub, qui se lit en partie:

Un "et" nécessite un sous-programme anonyme, qui, si elle est adoptée comme premier argument , ne nécessite pas le mot-clé "sub" ou une virgule suivante.
+0

Pourquoi ça ne marche pas quand c'est le premier argument? – Geo

+5

@Geo, cela peut fonctionner, mais vous devez être plus explicite: 'function (" whatever ", sub {print" Je suis dans le coderef \ n "});' La syntaxe 'name BLOCK EXPR' ne fonctionne que si le coderef vient en premier. – friedo

+4

Seulement parce qu'il a été conçu de cette façon. Je pense que la raison principale pour l'autoriser en premier lieu était de permettre aux utilisateurs d'écrire des sous-routines qui peuvent être appelées comme des fonctions intégrées qui prennent un petit fragment de code comme map et grep, mais quelque chose de plus flexible pourrait vite devenir confus. – Sean

-3

Ici, & $ est variable spéciale qui est utilisée pour correspondre au modèle exact d'un Perl. (vous l'avez utilisé à tort dans votre contexte) $ `est utilisé pour faire correspondre la chaîne avant le modèle donné. $ $ 'est utilisé pour faire correspondre la chaîne après le modèle donné.

+1

Dans le contexte dans lequel l'OP l'utilise, c'est un prototype de fonction. Voir http://perldoc.perl.org/perlsub.html#Prototypes – friedo

Questions connexes