作为一名C开发人员,我对perl语言很新。我的要求是我需要转换像
这样的值3-6,9 TO=> "3,4,5,6,9"
如果值为
,也是如此3-6,9-18 TO "3,4,5,6,9,10,11,12,13,14,15,16,17,18".
如何实现这一目标?谢谢。
答案 0 :(得分:5)
需要拆分两次才能检测到3,9-12
和3-6,9
use warnings;
use strict;
use feature 'say';
foreach my $string (q(3-6,9), q(3-6,9-12), q(3,9-12))
{
my @ranges = split /,/, $string; #/
my @result;
for (@ranges) {
my ($beg, $end) = split /-/;
push @result, ($end ? $beg .. $end : $beg);
}
my $res = join ',', @result;
say $res;
}
打印†
3,4,5,6,9 3,4,5,6,9,10,11,12 3,9,10,11,12
这适用于字符串1-3,8,10-12,...
等中的更多范围。请参阅range operator(..
)
另一种处理可能缺少范围结束的方法是
push @result, $beg .. $end // $beg;
其中//
是defined-or operator
†三元运算符中$end
的测试是针对“真值”的,undef
和''
(空字符串)都失败了和0
(数字零)。在这个问题中,$end
被认为是严格的正整数,这是隐式使用的。但是,undef
是预期的,最好是具体的
push @result, (defined $end ? $beg .. $end : $beg);
请注意,Perl中的“真相”有一些更有趣的案例。感谢Silvar发表评论。
答案 1 :(得分:0)
扩展范围的一种方法:
use strict;
use warnings;
my @newvals = ();
my @retrns = qw(3-6 9 89-99);
findRanges(@retrns);
sub findRanges
{
my @vals = @_;
@newvals = map { if($_=~m/(\d+)\-(\d+)/) { ($1 .. $2); } else { $_; } } @vals;
}
print join "\n", @newvals;