Необходимо выполнить двойное деление, чтобы можно было обнаружить пропущенный конец диапазона при печати 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,...
и т. Д. См. оператор диапазона (..
)
Другой способ обработки пропущенного конца диапазона -
push @result, $beg .. $end // $beg;
, где //
- это определенный или оператор
† Проверка $end
в троичном операторе для «истины», "и он не работает ни для undef
, ни для ''
(пустая строка), ни для 0
(число ноль).В этой задаче $end
предполагается строго положительным целым числом, и это неявно используется.Однако ожидается undef
, и лучше быть конкретным
push @result, (defined $end ? $beg .. $end : $beg);
Обратите внимание, что у "правды" в Perl есть еще несколько интересных случаев.Спасибо Silvar за комментарий.