2009-07-27 6 views
2

パラメータ$PGkeyがハッシュテーブル内で同じ名前のキーと等しいかどうかを確認したいと思います。さらに、私は可能な限りこれに近いフォーマットでそれをしたい: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"; 
    } 
} 

それを行う簡単な方法はありますか?使用

+1

正確に問題は何ですか?あなたのコードは動作していませんか? – innaM

+1

本当に "=="はあなたが望む演算子ですか? $ PGkeyと$ hash {$ PGkey}はどちらの数値ですか?それらが文字列の場合は、代わりに "eq"を使用します。 –

+0

ジョン - はい、文字列です。 Mani - あなたはChasの答えを見ることができます、多分それはあなたに私の解決された問題を明るくします:) – YoDar

答えて

3

conditional operatorは、あなたがその中で共通のコードをくくり出すことができます/ else文の場合:

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

それとも、単に問題を虚偽表示し、本当に$ハッシュを使用したい場合は、{$ PGkey} [$のID] $ハッシュ{$ PGkey}が存在し、それは、あなたが

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

簡単なメモを言うことができていない場合は、バック$ PGvalに落ちる場合は、古い裸の単語スタイルのファイルハンドルを使用しているように見えます。新しい(10歳が新しい考えることができる場合)字句ファイルハンドルは、あらゆる方法で優れている:

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

条件演算子「三項演算子」の呼び出しをやめてください。お願いします。 – chaos

+1

いいえ、チャス、しないでください。 – innaM

+3

@マンニー: "三元演算子"の意味を学んでください。 3つの引数を取る演算子を意味します。 '?:'は3つの引数をとる唯一の演算子ではありません。正当に定義されているのは、それが条件付き交替を定義するという事実であり、それはなぜそれを正しい名前、条件付き演算子で呼ぶのかです。 – chaos

15

方法は、ハッシュキーの存在を確認することです:

exists $hash{$key} 
関連する問題