Объявите и заполните хеш-таблицу за один шаг в 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 теперь есть собственный способ задавать вопрос "является ли это непроверенное значение любым из этих известных значений", это умное совпадение.

Другие вопросы по тегам