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