2009-07-27 10 views
2

Je veux vérifier si le paramètre $PGkey est égal à une clé portant le même nom dans une table de hachage. En outre, je veux le faire dans un format aussi proche que possible:Comment vérifier si une clé existe dans un hachage en Perl?

while(<PARAdef>) { 
    my($PGkey, $PGval) = split /\s+=\s+/; 
    if($PGkey == $hash{$PGkey}) { 
     print PARAnew "$PGkey = $hash{$PGkey}->[$id]\n"; 
    } else { 
     print PARAnew "$PGkey = $PGval\n"; 
    } 
} 

Existe-t-il un moyen simple de le faire?

+1

Quel est exactement le problème? Votre code ne fonctionne pas? – innaM

+1

Êtes-vous sûr que "==" est l'opérateur que vous voulez là-bas? Est-ce que $ PGkey et $ hash {$ PGkey} sont les deux nombres? Si ce sont des chaînes, utilisez plutôt "eq". –

+0

John - oui, ce sont des ficelles. Mani - vous pouvez voir Chas répondre, peut-être qu'il va vous allumer mon problème résolu :) – YoDar

Répondre

3

Utilisation du conditional operator vous permet de factoriser le code commun dans cette instruction if/else:

while (<PARAdef>) { 
    chomp; 
    my ($PGkey, $PGval) = split /\s+=\s+/; 
    print "$PGkey = ", 
     $PGval eq $hash{$PGkey}[$id] ? $hash{$PGkey}[$id] : $PGval, "\n"; 
} 

Ou si vous venez de comporter des anomalies du problème et je veux vraiment utiliser $ hash {PGkey $} [$ id] si hachage $ {$ PGkey} existe et revenir à $ PGval si elle n'a pas, alors vous pouvez dire

while (<PARAdef>) { 
    chomp; 
    my ($PGkey, $PGval) = split /\s+=\s+/; 
    print "$PGkey = ", 
     $PGkey ne "def" and exists $hash{$PGkey} ? 
      $hash{$PGkey}[$id] : $PGval, "\n"; 
} 

Une note rapide, vous semblez être en utilisant l'ancien style de bareword handles de fichiers. Les nouveaux (si dix ans peuvent être considérés comme nouveaux) handles de fichiers lexicales sont supérieurs dans tous les sens:

open my $PARAdef, "<", $filename 
    or die "could not open $filename: $!"; 
+3

S'il vous plaît, monsieur, arrêtez d'appeler l'opérateur conditionnel "l'opérateur ternaire". Je t'en supplie. – chaos

+1

Non, Chas, s'il vous plaît ne le faites pas. – innaM

+3

@Manni: Apprenez ce que signifie "opérateur ternaire", s'il vous plaît. Cela signifie un opérateur qui prend trois arguments. '?:' n'est pas le seul opérateur possible qui prend trois arguments. Ce qu'il est légitimement défini par le fait qu'il définit une alternance conditionnelle, c'est pourquoi l'appeler par son nom correct, l'opérateur conditionnel. – chaos

15

La façon de vérifier l'existence clé de hachage est:

exists $hash{$key}