2012-08-13 18 views
17

Ho una funzione di seguito in perl"Troppi argomenti" quando si passa un array al sub Perl?

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

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

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

     } 
     } 

} 

io chiamo questa funzione passando un argomento di matrice come qui di seguito:

create_hash(@files2); 

L'array ha in tutto 38 i valori in esso. Ma sto ottenendo gli errori di compilazione:

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

che cosa è il torto che sto facendo qui?

mia versione perl è:

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

Togliere il '()'? (Come in 'sub create_hash {..}') –

+0

cosa succede se chiami la tua funzione come: create_hash (files2); (senza segno "@" – Arfeen

+0

@ pst se rimuovo l'errore è: Array trovato dove l'operatore si aspetta alla riga process.pl 71, alla fine della riga (È necessario predeterminare create_hash?) errore di sintassi al processo .pl line 71, vicino a "create_hash @ files2" – Vijay

risposta

53

Il tuo problema è proprio qui:

sub create_hash() 
{ 

Il () è un prototype. In questo caso, indica che create_hash non accetta parametri. Quando cerchi di passarlo un po ', Perl si lamenta.

Dovrebbe apparire come

sub create_hash 
{ 

In generale, you should not use prototypes with Perl functions. Non sono come i prototipi nella maggior parte delle altre lingue. Hanno degli usi, ma questo è un argomento abbastanza avanzato in Perl.

+2

Dio benedica. mi stava rompendo la testa :) – N3Xg3N

-3

all'utente di riferimento array come:

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

create_hash(\@files2); 
+0

Uno * potrebbe * usare array-refs, ma genererebbe comunque un errore con 'sub create_hash() {rest_of_that_code}' .. –

+0

@pst: not "sub create_hash() {", it's " sub create_hash {" – cdtits

+2

@cdtits, mentre la vostra soluzione funziona, non siete riusciti a spiegare perché il codice di Peter non ha funzionato in primo luogo. – cjm

Problemi correlati