我有3个数组@energy, @es_energy and @hb_energy
,每个数组都使用相同的名称[$k]
编制索引。
我想找到@energy
中的最低值,然后使用该索引值查找其他数组中的相应值。
目前我正在使用my $n = nmin_by { $energy[$_] } 0 .. $#energy;
然后$n
用于从其他数组输出。但是,我不想使用nmin_by
因为它需要额外的库来下载我正在使用的软件包(管理问题的负载)。
有什么建议吗?
答案 0 :(得分:6)
use warnings;
use strict;
use feature 'say';
use List::Util qw(reduce);
my @ary = (12, 3, 1, 23);
my $min_idx = reduce { $ary[$a] < $ary[$b] ? $a : $b } 0..$#ary;
say $min_idx;
将其放在子目录中,以便在名称明确目的时实现不可见
use Carp;
sub get_min_idx {
my $ra = shift;
croak "Sub expects array reference" if ref $ra ne 'ARRAY';
return reduce { $ra->[$a] < $ra->[$b] ? $a : $b } 0..$#$ra;
}
my $min_idx = get_min_idx(\@ary);
将它放在一个模块中,你也可以用最小的入侵来改变它的工作方式。
可以详细说明错误消息(例如告诉用户已经传递了什么)并添加了检查;例如,给定数字<
比较,sub需要一个只有数字的数组。
语法clafirication:arrayref $rary
的最后一个元素的索引是$#$rary
(而数组@ary
的最后一个元素的索引是$#ary
)。
仔细选择您的子程序名称;有一个好名字可以帮助很多。
感谢Borodin评论对此的需求。