2

$PGkeyパラメータがハッシュテーブル内の同じ名前のキーと等しいかどうかを確認したい。さらに、できるだけこれに近い形式で実行したいと考えています。

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

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

4

2 に答える 2

15

ハッシュキーの存在を確認する方法は次のとおりです。

exists $hash{$key}
于 2009-07-27T14:26:23.153 に答える
3

条件演算子を使用すると、その if/else ステートメントの共通コードを除外できます。

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

または、問題を誤解していて、$hash{$PGkey} が存在する場合は $hash{$PGkey}[$id] を使用し、存在しない場合は $PGval にフォールバックしたい場合は、次のように言うことができます。

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

簡単に言うと、古いベアワード スタイルのファイルハンドルを使用しているようです。新しい (10 年前のものを新しいと見なすことができる場合) レキシカル ファイルハンドルは、あらゆる点で優れています。

open my $PARAdef, "<", $filename
    or die "could not open $filename: $!";
于 2009-07-27T14:10:06.237 に答える