代码之家  ›  专栏  ›  技术社区  ›  Vimal Bhaskar

基于符号的Perl字符串提取

  •  0
  • Vimal Bhaskar  · 技术社区  · 6 年前

    作为C开发人员,我对PerlLangauge还比较陌生。我的要求是我需要像

    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 回复  |  直到 6 年前
        1
  •  5
  •   zdim    6 年前

    需要分两次才能检测到两者的缺失范围 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 (数字0)。在这个问题上 美元的末端 假定为严格的正整数,并隐式使用。然而, 解脱 预期的,最好是具体的

    push @result, (defined $end ? $beg .. $end : $beg);
    

    注意,Perl中的“真相”有一些更有趣的例子。多亏了 Silvar 征求意见。

        2
  •  0
  •   Gerhard    6 年前

    扩展范围的一种方法:

    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;