2008-12-02 14 views
6

He aquí un pequeño programa de prueba:¿Por qué Perl aplasta mi matriz?

sub foo($;@) { 
    my $sql = shift; 
    my @params = @_; 

    print "sql: $sql\n"; 
    print "params: " . join(",", @params); 
} 

sub bar($;@) { 
    foo(@_); 
} 

bar("select * from blah where x = ? and y = ?",2,3); 
print "\n"; 

¿Por qué es la salida siguiente:

sql: 3 
params: 

En lugar de esto?

sql: select * from blah where x = ? and y = ? 
params: 2,3 

Respuesta

21

Es porque cuando se llama a foo(@_), el prototipo de foo() obliga al primer parámetro (que es una matriz) para ser convertido en un escalar (que es el número de elementos en @_).

Ver respuestas a mi pregunta anterior preguntando "Why are Perl Function Prototypes Bad"?

Fwiw, puede mantener los prototipos en su lugar si cambia bar así:

sub bar($;@) { 
    foo(shift, @_); 
} 
5

deshacerse de ($;@) después de sus nombres de funciones y trabaja muy bien.

Cuestiones relacionadas