Как в Perl получить произвольное значение из хэша?

#perl #hash

#perl #хэш

Вопрос:

Рассмотрим заполненный хэш:

 %hash = ( ... );
  

Я хочу получить значение из хэша; подойдет любое значение.

Я бы хотел избежать

 $arbitrary_value = (values %hash)[0];
  

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

Есть ли способ сделать это без создания списка значений?

ПРИМЕЧАНИЕ: оно не обязательно должно быть случайным. Подойдет любое значение.

Есть предложения?

РЕДАКТИРОВАТЬ: предположим, что я не знаю ни одного из ключей.

Комментарии:

1. Обновлено, чтобы подтвердить, что я не знаю никаких ключей

Ответ №1:

Используйте each :

 #!/usr/bin/env perl

use strict; use warnings;

my %h = qw(a b c d e f);

my (undef, $value) = each %h;
keys %h; # reset iterator;

print "$valuen";
  

Как указано в комментариях, в частности, вызов keys() в контексте void сбрасывает итератор без каких-либо других накладных расходов. Такое поведение существует по крайней мере с 2003 года, когда информация была добавлена в документацию для ключей и значений.

Комментарии:

1. scalar это перебор. Вы явно заставляете его выполнять больше работы, оценивая его в скалярном контексте вместо пустого контекста. Хотя чуть больше (создание скаляра с количеством ключей, возврат его, затем его освобождение)

Ответ №2:

Просто в качестве упражнения и с использованием %h переменной, предоставленной Sinan, для меня работает следующее:

 my (undef, $val) = %h;
print $val, "n";
  

И, конечно же, работает следующее:

 print((%h)[1], "n");
  

Забавный факт: похоже, что Perl использует тот же подход, что и для each , но без перехвата сброса итератора.