Perl基于符号的字符串提取

时间:2018-05-28 09:44:48

标签: perl

作为一名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".

如何实现这一目标?谢谢。

2 个答案:

答案 0 :(得分:5)

需要拆分两次才能检测到3,9-123-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;