perl - конвертировать строку числовых значений / диапазонов в реальные значения

Я хотел бы преобразовать жало формы 1,2,25-27,4,8,14,7-10 в список фактических значений: 1,2,4,7,8,9,10,14,25,26,27,

Я искал и ничего не нашел, что делает такое расширение. Кто-нибудь знает способ сделать это легко?

2 ответа

Решение
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";

выход

1 2 4 7 8 9 10 14 25 26 27

Другой способ сделать это быстро - использовать строковую версию eval. Но вы должны иметь в виду, что использование eval имеет определенные последствия для безопасности, поэтому вам лучше очистить любую строку перед ее передачей в 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   
Другие вопросы по тегам