Как получить ключ минимальных значений из ha sh in Perl - PullRequest
2 голосов
/ 04 августа 2020

У меня есть скрипт, который может выбирать минимальное значение из значений ha sh.

use strict;
use warnings;

use Data::Dumper;
use List::Util qw(min);

my @array = qw/50 51 52 53 54/;

my $time = 1596561300;

my %hash;

foreach my $element(@array){  
    $hash{$time} = $element;
    $time += 6; #based on some condition incrementing the time to 6s
}

print Dumper(\%hash);

my $min = min values %hash; 
print "min:$min\n";

Здесь я могу получить 50 как минимальное значение из всех значений в ha sh значений. Но как мне получить ключ ha sh, который соответствует минимальному значению, т.е. 1596561300.

Ответы [ 2 ]

5 голосов
/ 04 августа 2020

Из ключа можно получить значение. Итак, вам нужен ключ с минимальным связанным значением.

min LIST можно записать как reduce { $a <= $b ? $a : $b } LIST, поэтому мы можем использовать

use List::Util qw( reduce );

my $key = reduce { $hash{$a} <= $hash{$b} ? $a : $b } keys %hash;
my $val = $hash{$key};

или

my ($key) = keys(%hash);
my $val = $hash{$key};
for (keys(%hash)) {
   if ($hash{$_} < $val) {
      $key = $_;
      $val = $hash{$val};
   }
}
2 голосов
/ 04 августа 2020

См. Ответ @ikegami для самого чистого и быстрого решения точного вопроса OP. Если вам нужно получить доступ к другим ключам в порядке, отсортированном по значениям численно (из вашего примера я предполагаю, что это именно то, что вы хотите), используйте это:

my @keys_sorted_by_value = sort { $hash{$a} <=> $hash{$b} } keys %hash;

# key with min value: $keys_sorted_by_value[0]
# ...
# key with max value: $keys_sorted_by_value[-1]

Или отсортировано по значениям ASCIIбетически :

my @keys_sorted_by_value = sort { $hash{$a} cmp $hash{$b} } keys %hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...