Search code examples
perlstring-conversionnumeric-ranges

perl - convert string of numeric values/ranges to actual values


I'd like to convert a sting of the form 1,2,25-27,4,8,14,7-10 into a list of the actual values: 1,2,4,7,8,9,10,14,25,26,27.

I've searched and found nothing that does this sort of expansion. Anyone aware of way to do this easily?


Solution

  • my $s = "1,2,25-27,4,8,14,7-10";
    my %seen;
    my @arr =
      sort { $a <=> $b }
      grep { !$seen{$_}++ }
      map { 
        my @r = split /-/; 
        @r>1 ? ($r[0] .. $r[1]) : @r;
      }
      split /,/, $s;
    
    print "@arr\n";
    

    output

    1 2 4 7 8 9 10 14 25 26 27