如何用Perl获取哈希中的最大值与最小值?代码异常求助
Perl哈希求最值的问题修复
问题根源
- 哈希键重复导致数据丢失:Perl中哈希的键具有唯一性,你定义的
%timess里所有键都是TimeStamp,后续的键值对会直接覆盖前面的条目,最终哈希里只剩最后一组数据:'TimeStamp' => 129000.2323。 - min/max函数调用错误:
List::Util的max()和min()需要接收多个值或一个数组作为参数,你在循环中每次只传入单个值,自然返回该值本身。
修正方案
方案1:用数组存储时间戳(适合单类数据收集)
如果CSV里是一系列独立的TimeStamp值,直接用数组存储更合理:
#!/usr/bin/perl use strict; use warnings; use List::Util qw(min max); # 模拟从CSV读取的时间戳列表 my @timestamps = (127000.2323, 124000.2323, 125000.2323, 128000.2323, 129000.2323); my $maxTime = max(@timestamps); my $minTime = min(@timestamps); # 用%.4f保留小数位,避免%d截断小数 printf("max: %.4f, min: %.4f\n", $maxTime, $minTime);
方案2:使用唯一键的哈希(适合关联其他数据的场景)
如果需要保留每行的其他关联数据,给哈希设置唯一键(比如行号):
#!/usr/bin/perl use strict; use warnings; use List::Util qw(min max); # 键唯一的哈希,模拟CSV每行数据 my %timess = ( 'row_1' => 127000.2323, 'row_2' => 124000.2323, 'row_3' => 125000.2323, 'row_4' => 128000.2323, 'row_5' => 129000.2323 ); # 直接传入哈希的所有值给min/max my $maxTime = max(values %timess); my $minTime = min(values %timess); printf("max: %.4f, min: %.4f\n", $maxTime, $minTime);
正确输出
两种方案都会得到预期结果:
max: 129000.2323, min: 124000.2323
内容的提问来源于stack exchange,提问作者Bebe
相关产品推荐
相关产品推荐

