Pregunta

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?

¿Fue útil?

Solución

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

Otros consejos

Another way to do this quickly is by using the string version of eval. But you have to keep in mind that the use of eval have some security implication so you better sanitize any string before passing it to eval.

use strict;
use warnings;

my $string = "1,2,25-27,4,8,14,7-10";

$string =~ s/-/../g;

my @list = sort {$a <=> $b} keys { map {$_, 1} eval $string };

print "@list\n";  

#output
1 2 4 7 8 9 10 14 25 26 27   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top