Perl: получение значения из хэша с помощью карты - PullRequest
1 голос
/ 10 ноября 2009

Кажется, что я должен быть в состоянии сделать это с картой, но реальные детали ускользают от меня.

У меня есть список строк в массиве, и ноль или одна из них могут иметь значение хеш-функции.

Так что вместо того, чтобы делать:

foreach $str ( @strings ) {
  $val = $hash{$str} if $hash{$str};
}

Может ли это быть заменено однострочником с использованием карты?

Ответы [ 4 ]

6 голосов
/ 10 ноября 2009
@values = grep { $_ } @hash{@strings};

для учета того факта, что вам нужны только true значения.

Измените это на

@values = grep { defined } @hash{@strings};

, если вы хотите пропустить неопределенные значения.

4 голосов
/ 10 ноября 2009

Конечно, это будет:

map { $val = $hash{$_} } @strings;

То есть каждое значение @strings устанавливается в $_ по очереди (вместо $str, как в вашем foreach).

Конечно, это мало что дает, поскольку вы ничего не делаете со значением $val в своем цикле, и мы не собираем список, возвращаемый map.

Если вы просто пытаетесь создать список значений, это будет:

 @values = map { $hash{$_} } @strings;

Но более лаконично использовать фрагмент хеша:

 @values = @hash{@strings};

РЕДАКТИРОВАТЬ: Как указано в комментариях, если возможно, что @strings содержит значения, которые не являются ключами в вашем хэше, тогда @values получит undefs в этих позициях. Если это не то, что вам нужно, см. ответ Hynek для решения.

3 голосов
/ 11 ноября 2009

Я привык делать это так:

@values = map { exists $hash{$_} ? $hash{$_} : () } @strings;

но я не вижу в этом ничего плохого

push @values, $hash{$_} for grep exists $hash{$_}, @strings;

или

@values = @hash{grep exists $hash{$_}, @strings};
1 голос
/ 10 ноября 2009
map { defined $hash{$_} && ( $val =  $hash{$_})} @strings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...