Как я могу получить доступ к последнему ключу хэша Perl без использования временного массива? - PullRequest
4 голосов
/ 10 июля 2009

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

Я знаю, что хэши неупорядочены. Однако есть приложения (например, мое), в которых мои ключи можно упорядочить, используя простой вызов sort для ключей хеш-функции. Надеюсь, я объяснил, почему я этого хотел. Признаться, пример barney / elmo - плохой выбор, но у него есть свои приложения.

Учтите следующее:

my %hash = ( barney => 'dinosaur', elmo => 'monster' );
my @array = sort keys %hash;
print $array[$#{$hash}];
#prints "elmo"

Есть идеи, как это сделать без вызова temp (в данном случае @array)?

Ответы [ 7 ]

11 голосов
/ 10 июля 2009
print( (keys %hash)[-1]);

Обратите внимание, что дополнительные скобки необходимы для предотвращения путаницы в синтаксисе со списком параметров print.

Вы также можете использовать этот злой трюк, чтобы вывести его в скалярный контекст и покончить с лишними паренами:

print ~~(keys %hash)[-1];
4 голосов
/ 10 июля 2009

Обычно, если вы хотите последний, отсортированный по алфавиту, все просто:

use List::Util qw( maxstr );

print maxstr(keys %hash);

Если вы предпочитаете не использовать модуль (для которого я не вижу веской причины, но есть люди, которые любят усложнять его):

print( (sort keys %hash)[-1] );
2 голосов
/ 10 июля 2009

Хеши неупорядочены, поэтому не существует такой вещи, как «последний элемент». Функции для перебора хеша (keys, values и each) имеют порядок, но это не то, на что вам следует полагаться.

Технически говоря, хэши имеют "порядок хэшей", который используют итераторы. Порядок хеширования зависит от алгоритма хеширования, который может изменяться (и имеет) между различными версиями Perl. Более того, в версии 5.8.1 Perl содержит функции рандомизации хэшей, которые могут изменить алгоритм хэширования для предотвращения определенных типов атак.

В общем, если вы заботитесь о порядке, вы должны использовать вместо этого массив.

1 голос
/ 10 июля 2009

Чтобы сделать остальное более понятным, ключи хеша в Perl будут иметь одинаковый порядок каждый раз, когда вы вызываете ключи, значения или каждый из них в течение времени жизни того же процесса, при условии, что хеш не был изменен. От perlfunc :

Ключи возвращаются в случайном порядке. Фактический случайный порядок может быть изменен в будущих версиях Perl, но он гарантированно будет того же порядка, что и значения или каждая функция (если хэш не был изменен). Начиная с Perl 5.8.1, порядок разный даже для разных запусков Perl по соображениям безопасности (см. «Атаки алгоритмической сложности» в perlsec).

1 голос
/ 10 июля 2009

Согласно perldoc perldata :

Хэши - неупорядоченные коллекции скалярные значения индексируются их связанный строковый ключ.

Поскольку хэш неупорядочен. Так жаль. Нет «последнего» элемента.

0 голосов
/ 31 июля 2014
$h{'11c'} = 'C';
$h{'b'} = 'B';
$h{'e22'} = 'E';
$h{'aaaaa'} = 'AAAA';

for (keys %h){
       $a = \$h{$_} and $b = $_ if $a < \$h{$_};
}

print "$b\n";

! но будьте осторожны из-за очевидных причин

0 голосов
/ 10 июля 2009

Хэши неупорядоченный элемент. так что, может быть, ваш последний хеш-элемент - elmo /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...