#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
, но без перехвата сброса итератора.