По сути, хеш - это структура данных, оптимизированная для решения обратного вопроса, зная, присутствует ли ключ 2.Но сложно судить, не зная, поэтому предположим, что это не изменится.
Представленные здесь возможности будут зависеть от:
- как часто вам нужно это делать
- насколько динамичен хеш
Однократная операция
grep $_==2, values %x
(также пишется grep {$_==1} values %x
) вернет список из двух чисел, имеющихся в наличиив хэше или, в скалярном контексте, количество совпадений.Оценивается как логическое значение в условии, оно дает именно то, что вы хотите.
grep
работает на тех версиях Perl, сколько я помню. use List::Util qw(first); first {$_==2} values %x
возвращает толькопервый матч, undef
, если нет.Это делает его более быстрым, так как оно замкнет накоротко (остановит проверку элементов), как только это будет успешно выполнено.Это не проблема для 2, но позаботьтесь о том, чтобы возвращаемый элемент не обязательно оценивался как логическое true.Используйте defined
в этих случаях.
List::Util
является частью ядра Perl, так как 5.8. use List::MoreUtils qw(any); any {$_==2} values %x
возвращает именно ту информацию, которую вы запрашивали как логическое значение, идемонстрирует поведение короткого замыкания.
List::MoreUtils
доступно из CPAN. 2 ~~ [values %x]
возвращает именно ту информацию, которую вы запрашивали как логическое значение, и демонстрирует поведение короткого замыкания.
Интеллектуальное сопоставление доступно в Perl с 5.10.
Повторные операции, статический хэш
Создайте хэш, который сопоставляет значения с ключами, и используйтеэтот как естественный хеш для проверки существования ключа.
my %r = reverse %x;
if ( exists $r{2} ) { ... }
Повторный операционный, динамический хеш
Используйте обратный поиск, как указано выше.Вам нужно будет поддерживать его в актуальном состоянии, что оставлено в качестве упражнения для читателя / редактора.(подсказка: столкновение значений сложно)