Ответ 1
A фрагмент списка должен сделать это
(keys %h)[0]
keys
возвращает список, поэтому просто извлеките первый элемент этого списка.
Если у меня есть хеш
my %h = (
secret => 1;
);
и я знаю, что это только один ключ в хэше, но я не знаю, как он называется.
Нужно ли мне перебирать этот хэш
my $key;
foreach my $i (keys %h) {
$key = $h{$i};
}
Или есть лучший способ получить имя ключа?
A фрагмент списка должен сделать это
(keys %h)[0]
keys
возвращает список, поэтому просто извлеките первый элемент этого списка.
my ($key) = keys %h;
Поскольку вы используете контекст списка с обеих сторон оператора присваивания, первый элемент в списке ключей присваивается ключу $.
Я не считаю, что нужно использовать функцию keys
.
my ($key) = %h;
или
my $key = (%h)[0];
Хэш внутри parens будет расширен до списка, тогда мы можем просто взять первый элемент этого списка, который является ключом.
my @keys = keys %h;
my $key = $keys[0];
[ keys %h ]->[0]
также будет иметь значение Joel в предыдущем комментарии. Этот код пахнет, но это вызовет проблемы. Если действительно существует только одна пара ключей/значений, может быть лучший способ обработки данных.
По крайней мере, я бы удостоверился, что ожидания никогда не нарушаются молча. Например, & тир;
keys %h == 1 or die "ETOOMANYKEYS";
print [ keys %h ]->[0], $/;
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;
Пусть имеют вид в
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;
То, с чего мы начали.