我有一个哈希,它将字符串存储为键,并将它们的出现存储为值。
$VAR1 = {
'ABCD' => 2,
'EFGH' => 7,
'IJKL' => 17,
'MNOP' => 2,
'OPMN' => 300,
'QRST' => 300,
'DEAC' => 300
}
Run Code Online (Sandbox Code Playgroud)
我想找到这个哈希值的最小值和最大值。例如,最小值 = 2,最大值 = 300
我尝试了以下代码,但出现错误Can't use string ("17") as an ARRAY ref while "strict refs" in use at
$minAssigned = min(@{$countPat{$pat4C}});
$maxAssigned = max(@{$countPat{$pat4C}});
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误。此外,一旦我有了这些数字,我想循环遍历同一哈希值 minAssigned 到 maxAssigned 次并打印这些值的总出现次数。例如,值 2 出现 2 次,值 17 出现 1 次,值 300 出现 3 次。
使用值来获取哈希值列表。
#!/usr/bin/perl
use warnings;
use strict;
use List::Util qw{ min max };
my $h = {
'ABCD' => 2,
'EFGH' => 7,
'IJKL' => 17,
'MNOP' => 2,
'OPMN' => 300,
'QRST' => 300,
'DEAC' => 300
};
print min(values %$h), "\n";
print max(values %$h), "\n";
Run Code Online (Sandbox Code Playgroud)
使用另一个散列来计算频率:
my %freq;
++$freq{$_} for values %$h;
for my $k (keys %freq) {
print "$k occurs $freq{$k} times.\n";
}
Run Code Online (Sandbox Code Playgroud)
在时间关键的循环中并且对于大量值,您可以切换到minmaxList ::MoreUtils(或List::SomeUtils或List::AllUtils)。
my ($min, $max) = minmax(values %$h);
Run Code Online (Sandbox Code Playgroud)