2012-08-13 20 views
17

que tienen una función más adelante en Perl"Demasiados argumentos" al pasar una matriz a Perl sub?

sub create_hash() 
{ 
my @files = @_; 

     foreach(@files){ 
     if(/.text/) 
     { 

     open($files_list{$_},">>$_") || die("This file will not open!"); 

     } 
     } 

} 

estoy llamando esta función pasando un argumento de matriz, como a continuación:

create_hash(@files2); 

La matriz tiene alrededor de 38 valores en ella. Pero estoy recibiendo errores de compilación:

Too many arguments for main::create_hash at .... 

lo que es el mal que estoy haciendo aquí?

mi versión de Perl es:

This is perl, v5.8.4 built for i86pc-solaris-64int 
(with 36 registered patches, see perl -V for more detail) 
+9

Retirar del '()'? (Como en 'sub create_hash {..}') –

+0

qué sucede si llama a su función como: create_hash (files2); (sin el signo "@") – Arfeen

+0

@ pst si los elimino error es: Array encontrado donde se esperaba operador en process.pl línea 71, al final de la línea (¿Necesita predeclarar create_hash?) error de sintaxis en proceso .pl línea 71, cerca de "create_hash @ files2" – Vijay

Respuesta

53

Su problema está aquí:

sub create_hash() 
{ 

El () es una prototype. En este caso, indica que create_hash no toma parámetros. Cuando intentas pasarlo, Perl se queja.

Debe quedar como

sub create_hash 
{ 

En general, you should not use prototypes with Perl functions. No son como prototipos en la mayoría de los otros idiomas. Tienen usos, pero ese es un tema bastante avanzado en Perl.

+2

Dios bendiga. me estaba rompiendo la cabeza :) – N3Xg3N

-3

podríamos usar como referencia de matriz:

sub create_hash { 
    my ($files) = @_; 
    foreach(@{$files)){ 
     ... 
    } 
} 

create_hash(\@files2); 
+0

Uno * podría * usar array-refs, pero aun así generaría un error con 'sub create_hash() {rest_of_that_code}' .. –

+0

@pst: no "sub create_hash() {", es " sub create_hash {" – cdtits

+2

@cdtits, mientras que su solución funciona, usted no pudo explicar por qué el código de Peter no funcionó en primer lugar. – cjm

Cuestiones relacionadas