【发布时间】:2021-12-26 08:48:21
【问题描述】:
我有一段代码从两个大的排序整数数组之一中提取一个切片,代表程序工作流程中的停止点。我将在此处包括两者之一。
基本想法是,我试图从这个大数组中切出一个工作范围,作为该程序运行的起点。 $min是从任务对象中拉出来的,代表任务的当前进度。 $limit 是可选的用户覆盖,默认为 -1(被忽略)。
目前,我正在使用来自List::MoreUtils CPAN 模块的firstidx 函数来检索开始和结束的索引,然后我使用它们以通常的方式对@steps 数组进行切片。有没有更快和/或更惯用的方法来做到这一点?特别是,有没有直接使用$min 和$limit 值的好方法($limit == -1 案例的另一个代码路径)?
代码如下:
my @steps = (
0, 1, 5, 10,
20, 30, 40, 50, 60, 70, 80, 90, 100,
200, 300, 400, 500, 600, 700, 800, 900, 1000,
1200, 1400, 1600, 1800, 2000,
2500, 3000, 3500, 4000, 4500, 5000,
6000, 7000, 8000, 9000, 10000,
11000, 12000, 13000, 14000, 15000, 17500, 20000,
25000, 30000, 35000, 40000, 45000, 50000,
60000, 70000, 80000, 90000, 100000
);
my $min_index = firstidx { $_ > $min } @steps;
my $max_index;
if ($limit == -1) {
$max_index = @steps - 1;
} else {
$max_index = firstidx { $_ >= $limit } @steps;
}
my @steps_todo = @steps[ $min_index .. $max_index ];
【问题讨论】:
-
您确定开始/结束条件吗?
$min为 5 时从 10 开始。$limit为 31 时从 40 结束? -
@clamp 是的,没错。
@steps_todo是一个素筛程序的最大 p 值列表,前提是我在每一步检查因子去除率以确定是否值得继续。由于已经达到$min步骤(当前进度),因此它被跳过。它被认为对我的工作流程来说太混乱了,不允许自定义步骤(如 31),所以它向上取整。