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

如何在Perl中展开n-m格式的数值范围?

解决Perl中数字范围展开的问题

嘿,刚从C转Perl的朋友,这个需求其实挺常见的,用Perl的正则和内置特性就能轻松搞定。我给你写个直接能用的实现,还加了注释方便你理解:

完整代码示例

#!/usr/bin/perl
use strict;
use warnings;

sub expand_number_ranges {
    my ($input) = @_;
    my @result;
    
    # 按逗号分割输入字符串,逐个处理每个片段
    foreach my $part (split /,/, $input) {
        # 匹配"数字-数字"的范围格式
        if ($part =~ /^(\d+)-(\d+)$/) {
            # 用Perl的范围运算符直接生成连续数字列表,添加到结果中
            push @result, $1 .. $2;
        } else {
            # 单个数字直接添加,同时过滤非数字的非法输入
            push @result, $part if $part =~ /^\d+$/;
        }
    }
    
    # 将结果数组拼接成逗号分隔的字符串返回
    return join(',', @result);
}

# 测试你的两个例子
my $test_case1 = "3-6,9";
print expand_number_ranges($test_case1) . "\n"; # 输出: 3,4,5,6,9

my $test_case2 = "3-6,9-18";
print expand_number_ranges($test_case2) . "\n"; # 输出: 3,4,5,6,9,10,11,12,13,14,15,16,17,18

代码解释

  • use strict; use warnings;:这是Perl的最佳实践,就像C里开启编译警告一样,能帮你提前发现代码里的错误和潜在问题,千万别省略。
  • 分割输入:用split /,/, $input把输入字符串按逗号拆分成独立的片段,比如把"3-6,9"拆成"3-6"和"9"。
  • 匹配范围:正则表达式/^(\d+)-(\d+)$/专门匹配X-Y这种范围格式,捕获起始数字$1和结束数字$2。然后用Perl的**范围运算符..**直接生成从$1到$2的连续数字列表,这比C里手动写循环方便太多了!
  • 处理单个数字:如果片段不是范围格式,就检查是不是纯数字,是的话直接添加到结果数组里。
  • 拼接结果:最后用join(',', @result)把数组转换成逗号分隔的字符串,就是你想要的输出格式。

如果之后需要处理更复杂的情况(比如负数、带前导零的数字),只需要调整正则表达式和判断逻辑就行,当前代码完全满足你给出的两个测试场景。

内容的提问来源于stack exchange,提问作者Vimal Bhaskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:18:05