2009-07-27 13 views
2

Ich möchte überprüfen, ob der Parameter $PGkey gleich einem Schlüssel mit dem gleichen Namen in einer Hash-Tabelle ist. Weiter möchte ich es in einem Format so nahe wie möglich tun:Wie überprüfe ich, ob ein Schlüssel in einem Hash in Perl existiert?

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"; 
    } 
} 

Gibt es eine einfache Möglichkeit, es zu tun?

+1

Was genau ist das Problem? Funktioniert dein Code nicht? – innaM

+1

Sind Sie sicher "==" ist der Operator, den Sie dort haben wollen? Sind $ PGkey und $ Hash {$ PGkey} beide Zahlen? Wenn es sich um Zeichenfolgen handelt, verwenden Sie stattdessen "eq". –

+0

John - ja, sie sind Saiten. Mani - Sie können Chas Antwort sehen, vielleicht wird es Sie mein gelöstes Problem beleuchten :) – YoDar

Antwort

3

Mit der conditional operator können Sie den gemeinsamen Code ausklammern, dass wenn/else-Anweisung:

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

Oder wenn Sie falsche Angaben nur das Problem und wirklich wollen, $ hash {$ PGkey} [$ id] verwenden wenn $ hash {$ PGkey} existiert und zurück zu $ ​​PGval fallen, wenn es nicht der fall, dann kann man

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

Eine kurze Anmerkung sagen, Sie scheinen mit Handles die alten Bareword Stil werden. Die neuen (wenn 10 Jahre alt neu betrachtet werden kann) lexikalischen Dateihandies überlegen sind in jeder Hinsicht:

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

Bitte, Sir, hören Sie auf, den bedingten Operator "ternary operator" aufzurufen. Ich flehe dich an. – chaos

+1

Nein, Chas, bitte nicht. – innaM

+3

@Manni: Lernen Sie bitte, was "ternärer Operator" bedeutet. Es bedeutet einen Operator, der drei Argumente annimmt. '?:' ist nicht der einzige mögliche Operator, der drei Argumente benötigt. Worin es legitim definiert ist, ist die Tatsache, dass es eine bedingte Alternation definiert, weshalb man es mit seinem richtigen Namen den bedingten Operator nennt. – chaos

15

Der Weg für die Hash-Schlüssel Existenz zu überprüfen ist:

exists $hash{$key} 
Verwandte Themen