2016-02-02 2 views
-3

J'ai ce segment d'un script perl:Perl: autovivification ne crée pas un tableau en hachage

my $thread_count = 20 

my %QUEUES; 
my $current_queue=0; 

while(defined($INPUT[$cnt])) 
{ 
     while (my @instance = $q1->fetchrow_array) 
     { 
       my $walk = "string"; 
       push @{$QUEUES{$current_queue}},$walk; 
       $current_queue=($current_queue+1)%$thread_count; 
     } 

     while (my @instance = $q2->fetchrow_array) { 
       my $walk = "string"; 
       push @{$QUEUES{$current_queue}},$walk; 
       $current_queue=($current_queue+1)%$thread_count; 
     } 
} 

je tente de pousser les commandes dans un tableau, que j'ai décidé de garder dans un hachage parce que je pensais Je pourrais garder ma vie facile et ne pas faire

J'ai utilisé Data::Dumper et une boucle régulière pour et trouvé que rien n'a été défini pour une clé dans $ QUEUE, 0 à $ thread_count-1. N'est-ce pas un usage d'auto-vivification de manuel? Qu'est-ce que je fais mal?

+2

Ce code ne sera pas exécuté. Pourquoi ne faites-vous pas un [mcve] qui affiche le même problème que vous rencontrez? –

+1

Je ne suis pas sûr de ce que vous pensez être supposé se passer avec '($ current_queue + 1)% $ thread_count' ... –

+0

@MattJacob: $ $ current_queue = ($ current_queue + 1)% $ thread_count; '$ current_queue' par un modulo' $ thread_count'. Il n'y a sûrement rien de bizarre là-bas, n'est-ce pas? Cela dit, je suis incapable de reproduire le problème comme décrit, donc je vote pour mettre cette question en attente jusqu'à ce qu'un exemple réel démontrant le comportement indésirable est fourni. –

Répondre

2
push @{ $QUEUES{$current_queue} }, $walk; 

est équivalent à

push @{ $QUEUES{$current_queue} //= [] }, $walk; 

Si cette déclaration se est exécutée lorsque $QUEUES{$current_queue} n'existait pas, $QUEUES{$current_queue} obtiendrait créé, et il serait attribué une référence à un tableau avec un élément (une copie de $walk). Donc, si %QUEUES est vide, les instructions push n'ont jamais été exécutées.

+0

Désolé pour le long délai. Merci pour votre réponse perspicace. Il s'avère après quelques recherches que la boucle ne s'est jamais exécutée car 'fetchrow_array' n'a jamais rien retourné. Je ne peux toujours pas comprendre pourquoi, ou ce que je peux faire à ce sujet. Pourtant, votre réponse a été très utile. Merci. –

+0

Il le fera s'il n'y a plus d'enregistrements à lire. – ikegami