Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > получить 1 ключ из хэша


Автор: sir_nuf_nuf 15.9.2008, 20:08
Есть хэш который использовался для проверки уникальности чего - либо.
По смыслу - в нем всего 1 ключ (если 2 - это ошибка бизнес - логики)

Задача - красиво извлечь оттуда этот ключ.

Господа, однострочники, предлагайте решения =)

мое:
Код

$a = shift @{[%b]};


щитаю сие все-таки хаком =(

Автор: arto 15.9.2008, 20:19
(keys %hash)[0]?

Автор: sir_nuf_nuf 15.9.2008, 21:33
arto, интуиция подводит =)

Код

%a = (a => 1);
print (keys %a)[0];

syntax error at - line 2, near ")["
Execution of - aborted due to compilation errors.

Автор: arto 15.9.2008, 21:50
# perl -le '%a = (''a'' => 1); print ((keys %a)[0]);'
a
#

Автор: DaemonSuw 15.9.2008, 22:01
я так понимаю "извлечь" - это удалить и получить значение, но ваше решение
Цитата

$a = shift @{[%a]};
print %a;

выдает 
Цитата

a1

Если удалять элемент не надо тогда достаточно просто ($a,undef) = each %a, или просто $a=each %a?

Автор: amg 16.9.2008, 06:48
Цитата(sir_nuf_nuf @  15.9.2008,  20:08 Найти цитируемый пост)
Господа, однострочники, предлагайте решения =)
Код
($a) = %a;


Автор: sir_nuf_nuf 16.9.2008, 06:58
Цитата(amg @  16.9.2008,  06:48 Найти цитируемый пост)
($a) = %a;

ага, в принципе хорошо, но использовать это предполагалось именнов скалярном конетксте:
Код

my $self = {
   a => shift @{[%hash]},
   b => 1,
};


Добавлено через 4 минуты и 2 секунды
DaemonSuw, +1.

Действительно each в cкалярном контексте решает задачу =)

Цитата

each HASH

When called in list context, returns a 2-element list consisting of the key and value for the next element of a hash, so that you can iterate over it. When called in scalar context, returns only the key for the next element in the hash.


Итак решение: 
Код

$a=each %a;


или в нашем случае:
Код

$self = {
    a => scalar each %hash,
    b => 1,
};

Автор: ginnie 16.9.2008, 11:29
sir_nuf_nuf, еще вариант

Код

$self = {
    a => (%hash)[0],
    b => 1,
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)