Подтвердить что ты не робот

Найти имя ключа в хэш только с одним ключом?

Если у меня есть хеш

my %h = (
    secret => 1;
);

и я знаю, что это только один ключ в хэше, но я не знаю, как он называется.

Нужно ли мне перебирать этот хэш

my $key;
foreach my $i (keys %h) {
    $key = $h{$i};
}

Или есть лучший способ получить имя ключа?

4b9b3361

Ответ 1

A фрагмент списка должен сделать это

(keys %h)[0]

keys возвращает список, поэтому просто извлеките первый элемент этого списка.

Ответ 2

my ($key) = keys %h;

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

Ответ 3

Я не считаю, что нужно использовать функцию keys.

my ($key) = %h;

или

my $key = (%h)[0];

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

Ответ 4

my @keys = keys %h;
my $key = $keys[0];

Ответ 5

[ keys %h ]->[0] также будет иметь значение Joel в предыдущем комментарии. Этот код пахнет, но это вызовет проблемы. Если действительно существует только одна пара ключей/значений, может быть лучший способ обработки данных.

По крайней мере, я бы удостоверился, что ожидания никогда не нарушаются молча. Например, & тир;

keys %h == 1 or die "ETOOMANYKEYS";
print [ keys %h ]->[0], $/;

Ответ 6

my $k = each %h;

Однако, вы должны помнить итератор, если вы захотите снова использовать его в том же хеше. Либо другой each сделает это, либо keys будет, и если он используется в скалярном контексте, это позволит избежать создания списка. Таким образом, вы можете reset с

scalar keys %h; 
# OR
each %h;          # <- gets the undef
my $k2 = each %h; # <- gets the first key

Итак, вы можете сделать это вот так:

my $k = ( scalar keys %h, each %h );

Но предполагая, что он читает сообщения JSON и прочее, где вы просто хотите прочитать, что в хэше, и выбросить, это, вероятно, наиболее кратким. Однако, если вы хотите, чтобы переменная сразу же, это, вероятно, проще сделать:

my ( $k, $v ) = each %$simple_JSON_structure;

Ответ 7

Пусть имеют вид в

my ($key) = %h;

Хэши и массивы не такие разные, как кажется. Они оба тесно связаны со списками. Использование списков - это способ, которым они обычно инициализируются, и => в основном является псевдонимом для , с той лишь разницей, что он лечит его левый операнд, который цитируется неявно. Perl останавливается только в том случае, если вы забыли цитату из своего правого операнда, поэтому будут приняты следующие две строки:

my %h = (a=>b=>c=>'d');
my @a = (a=>b=>c=>'d');

Хорошо, вы когда-нибудь пробовали это?

my %h = ('key');

... или это:

my @a = ('value');
my %h = @a;

Хэш выше может показаться немного странным, но это всего лишь ключ со значением undef.

Поскольку, скорее всего, вы спросите, как получить доступ к одному значению, я предлагаю использовать:

my ($key, $value) = %h;

... или даже проще:

my ($key) = %h;

То, с чего мы начали.