Объявите и заполните хеш-таблицу за один шаг в Perl
В настоящее время, когда я хочу создать справочную таблицу, я использую:
my $has_field = {};
map { $has_field->{$_} = 1 } @fields;
Есть ли способ сделать встроенную инициализацию за один шаг? (т.е. заполнить это в то же самое время, я объявляю это?)
3 ответа
Просто используйте свою карту, чтобы создать список, а затем перейдите к хеш-ссылке, например:
my $has_field = { map { $_ => 1 } @fields };
Обновление: извините, это не совсем то, что вы хотите, так как вам все равно нужно сначала объявить $has_field.
Вы можете использовать ломтик хеша:
@{$has_field}{@fields} = (1)x@fields;
Правая сторона использует x
оператор для повторения одного по скалярному значению @fields (т. е. по количеству элементов в вашем массиве). Еще один вариант в том же духе:
@{$has_field}{@fields} = map {1} @fields;
Там, где я проверял, умное сопоставление может быть в 2-5 раз быстрее, чем создание хеша поиска и тестирование значения один раз. Так что, если вы не собираетесь многократно использовать хэш, лучше сделать умное совпадение:
if ( $cand_field ~~ \@fields ) {
do_with_field( $cand_field );
}
Хорошо помнить, что с 5.10 у Perl теперь есть собственный способ задавать вопрос "является ли это непроверенное значение любым из этих известных значений", это умное совпадение.