2011-03-16 4 views
-2

I ont 3 hash GLOBAL définis en Perl commeutilisant hash initialisées en perl

my %a =(); 
my %b =(); 
my %c =(); 

par code suivant apparaît: -

if(checkSomeCondition) { 
    %c = %a; 
} 
else { 
    %c = %b; 
} 
do some operations on %c 

mais le problème est depuis% a et% b est toujours pas initialisés ,% c prend une valeur indéfinie de% a et% b. donc cette opération que maintenant je fais sur% c ne passe pas à% a ou% b valide. Supposons que si j'affecte% c à% a, plus tard, je reviens à condition if et assigne maintenant à% b, reviens à assigner% a, cette fois% a n'a pas de valeur valide pour montrer valide opérations effectuées précédemment.

Comment contourner ce problème?

+5

Il fait ce que vous dites à faire. Pouvez-vous nous dire quel est le problème? –

+0

'my% a =();' doit être écrit 'mon% a;'. vous pouvez également combiner la définition des hash 'mon (% a,% b, c%);' –

Répondre

0

Le comportement est attendu.

Lorsque vous effectuez l'opération:% c =% a, Le hachage% c est remplacé par le contenu de% a, copie essentiellement de% a à c%. Donc, si% a est vide/non défini,% c sera indéfini après l'opération ci-dessus (même si% c avait du contenu avant l'opération, il sera maintenant vide).

Comme mentionné par 'runrig', vous devriez probablement ajouter quelques vérifications supplémentaires avant de copier sur les hachages.

Si vous pouvez fournir plus de détails sur ce que vous essayez d'atteindre exactement, peut-être peut aider.

1

Les hachages n'ont pas d'état "initialisé" ou "non initialisé". Ils sont vides ou ont un contenu.

On ne sait vraiment pas ce que vous éprouvez; Souhaitez-vous que les modifications de% c prennent effet en% a ou en% b selon votre condition? Si c'est le cas, vous devriez utiliser une référence de hachage.

3

Si je comprends bien votre question, ce que vous recherchez est des références:

my (%a, %b, $c); # $c is a scalar to hold the hash reference 

if (condition) { 
    $c = \%a; # the `\` operator takes a reference to the variable 
} else { 
    $c = \%b; 
} 

# do stuff with %$c 

Donc, en supposant condition était vrai:

$$c{new_key} = 'value'; # or `$c->{new_key} = 'value';` 

print "$_: $a{$_}\n" for keys %a; # prints "new_key: value" 

Vous pouvez en savoir plus sur les références de Perl à la page de manuel perlref .

Enfin, j'espère que les noms de variables que vous utilisez sont simplement pour cet exemple. Des noms de variables plus longs aident à documenter votre code.

+0

Pourquoi cette voté contre-? –