You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl实现FIFO顺序数组扣减计算的代码问题排查

问题排查与解决方案

原代码问题分析

  • 嵌套循环逻辑错误:内层对@subtr的遍历每次进入外层@base循环都会完整执行一遍,导致每个@subtr元素被重复扣减多次,完全不符合FIFO单次扣减的要求
  • 未传递超额扣减额度:当前@base元素不足以覆盖当前待扣减额度时,没有计算超额部分传递给下一个@base元素,而是直接进入下一轮循环
  • 未记录指针位置:没有单独的指针分别记录当前待扣减的@subtr元素位置、当前正在使用的@base元素位置,无法实现扣减流程的接续

修正后可运行代码

use strict;
use warnings;

my @base = (10,15,6,2);
my @subtr = (2,4,6,2,2,5,7,2);

# 双指针分别标记当前base元素索引、当前subtr元素索引
my $base_idx = 0;
my $subtr_idx = 0;
my $current_base = $base[$base_idx];

# 遍历所有subtr元素直到全部扣减完成
while ($subtr_idx < scalar @subtr) {
    my $to_sub = $subtr[$subtr_idx];
    if ($current_base > $to_sub) {
        # 当前base足够扣减,直接减,移到下一个subtr
        $current_base -= $to_sub;
        $subtr_idx++;
    } elsif ($current_base == $to_sub) {
        # 刚好扣完当前base,移到下一个base,移到下一个subtr
        $base_idx++;
        $current_base = $base[$base_idx] if $base_idx < scalar @base;
        $subtr_idx++;
    } else {
        # 当前base不够扣,计算差额,移到下一个base,继续扣当前subtr的差额
        my $remain_sub = $to_sub - $current_base;
        $base_idx++;
        die "base数组所有元素已扣完,仍有未完成扣减的subtr元素" if $base_idx >= scalar @base;
        $current_base = $base[$base_idx];
        $current_base -= $remain_sub;
        $subtr_idx++;
    }
}

# 计算总剩余
my $total_remain = $current_base;
for (my $i = $base_idx + 1; $i < scalar @base; $i++) {
    $total_remain += $base[$i];
}

# 输出结果,位置从1开始计数符合常规使用习惯
my $final_pos = $base_idx + 1;
my $final_remain = $current_base;

print "扣减结束所处的base元素位置:$final_pos\n";
print "当前元素剩余值:$final_remain\n";
print "base数组总剩余值:$total_remain\n";

运行结果验证

运行代码后输出如下,完全匹配预期要求:

扣减结束所处的base元素位置:3
当前元素剩余值:1
base数组总剩余值:3

内容的提问来源于stack exchange,提问作者Paul Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:24:03