2011-08-08 4 views
2

J'écris ce code dans perl où je crée une clé unique et lui assigne une valeur.Référence trouvée où la liste de tailles égales est attendue

sub populate { 
     my $file = shift; 
     my %HoH = shift; 

     open(INFILE,$file); 
     . 
     . 
     . 
     $final_name = $prepend.$five; 
     $HoH{$final_name} = $seven; 
} 

Maintenant, je passe deux paramètres à un sous-programme qui id comme

&populate(\%abc,$file_1); 
&populate(\%xyz,$file_2); 

Pourquoi ne me donne une erreur comme ceci:

Reference found where even-sized list expected 
+3

Quelle que soit la documentation que vous lisez qui vous dit d'utiliser la forme à deux arguments de «ouvrir» est obsolète. Utilisez la forme à trois arguments: 'open my $ INFILE, '<', $ file'. (Et vérifier les erreurs.) –

+0

mais $ fichier contient l'adresse de l'emplacement du fichier. – kunal

+1

Je ne suis pas sûr de ce que vous voulez dire par là. '$ file' devrait contenir le * nom * du fichier. Les appels 'open (INFILE, $ file)' et 'open my $ INFILE, '<', $ file' sont presque équivalents, mais ce dernier est meilleur. 'perldoc -f open' pour plus d'informations. (Et vous manquez un '$' dans votre source, 'mon fichier = shift,' devrait être 'mon $ file = shift;'.) –

Répondre

11

Parce que votre hachage est attribué à une référence, et non un hachage (liste de taille paire). Vous devez faire:

my $hashref = shift; 

... 

$hashref->{$final_name} = $seven; 

ETA: Vous devez appeler sans & sous-routines, par exemple populate(...), sauf si vous souhaitez spécifiquement remplacer le prototype du sous-marin. Si vous ne savez pas ce qu'est un prototype, n'utilisez pas &. ETA2: Vous devriez vraiment utiliser un descripteur de fichier lexical et un argument ouvert à trois arguments. Considérez ce scénario:

open INFILE, $file; 
some_sub(); 
$args = <INFILE>; # <--- Now reading from a closed filehandle 

sub some_sub { 
    open INFILE, $some_file; 
    random code... 
    close INFILE; 
} 
+0

thanks.So ai-je passé dans le hachage à la sous-routine correctement et peupler (\% abc, $ file_1) – kunal

+0

Eh bien, non, puisque vous affectez '\ abc' au fichier, et' $ file_1' au hachage. – TLP

+0

il me donne une erreur disant Utilisation de la valeur non initialisée dans open.I ouvre comme ceci ouvert (, $ file) – kunal

Questions connexes