如何在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
相关产品推荐
相关产品推荐

