2009-07-27 5 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 - вы можете видеть ответ Часа, может быть, он зажжет вас на мою решаемую проблему :) – YoDar

ответ

3

Использование conditional operator позволяет вынесем общий код в том, что если/другое заявление:

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

Или если вы просто искажены проблему и действительно хотите использовать $ хэш {$ PGkey} [$ ID] если $ хэш {$ PGkey} существует и упасть обратно до $ PGval, если это не так, то вы можете сказать

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

быстрое примечание, вы, кажется, использует старые bareword дескрипторов стиля. Новые (если десять лет можно считать новым) лексические дескрипторы файлов превосходят во всех отношениях:

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

Пожалуйста, сэр, прекратите вызывать условный оператор «тройной оператор». Прошу вас. – chaos

+1

Нет, Час, пожалуйста, нет. – innaM

+3

@Manni: Узнайте, что означает «тернарный оператор», пожалуйста. Это означает оператор, который принимает три аргумента. '?:' не единственный возможный оператор, который принимает три аргумента. То, что это законно определено, состоит в том, что он определяет условное чередование, поэтому его можно назвать правильным именем - условным оператором. – chaos

15

Способ проверить хэш-ключа существования:

exists $hash{$key} 
Смежные вопросы