Конечно, это будет:
map { $val = $hash{$_} } @strings;
То есть каждое значение @strings
устанавливается в $_
по очереди (вместо $str
, как в вашем foreach).
Конечно, это мало что дает, поскольку вы ничего не делаете со значением $val
в своем цикле, и мы не собираем список, возвращаемый map
.
Если вы просто пытаетесь создать список значений, это будет:
@values = map { $hash{$_} } @strings;
Но более лаконично использовать фрагмент хеша:
@values = @hash{@strings};
РЕДАКТИРОВАТЬ: Как указано в комментариях, если возможно, что @strings
содержит значения, которые не являются ключами в вашем хэше, тогда @values
получит undefs в этих позициях. Если это не то, что вам нужно, см. ответ Hynek для решения.