2010-03-04 8 views
7

Este es el código:¿Por qué obtengo un error de sintaxis cuando paso un coderef a esta subrutina de Perl prototipada?

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

Si trato de llamarlo así:

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

consigo Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { ". ¿Cómo puedo llamarlo sin tener que agregar sub al frente del bloque de código?

Respuesta

18

Ponga el argumento coderef primera:

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

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

Consulte la página del manual perlsub, que dice en parte:

Una "y" requiere una subrutina anónima, que, si se aprueba como primer argumento , no requiere la palabra clave "sub" o una coma posterior.
+0

¿por qué no funciona cuando es el primer argumento? – Geo

+5

@Geo, puede funcionar, pero debe ser más explícito: 'function (" whatever ", sub {print" I'm within the coderef \ n "});' La sintaxis 'name BLOCK EXPR' solo funciona si el coderef es lo primero. – friedo

+4

Solo porque fue diseñado de esa manera. Sospecho que la razón principal para permitirlo en primer lugar fue permitir a los usuarios escribir subrutinas que pueden llamarse funciones integradas que toman un pequeño fragmento de código como map y grep, pero cualquier cosa más flexible podría confundir rápidamente. – Sean

-3

Aquí, $ & es una variable especial de Perl que se utiliza para que coincida con el patrón exacto. (lo ha usado incorrectamente en su contexto) $ `se usa para hacer coincidir la cadena antes del patrón dado. $ 'se usa para hacer coincidir la cadena después del patrón dado.

+1

En el contexto en el que el OP lo usa, es un prototipo de función. Ver http://perldoc.perl.org/perlsub.html#Prototypes – friedo

Cuestiones relacionadas