0x0006 Digit range expansion. Раскрытие диапазона чисел

На входе имеется набор чисел вида 1,2,4-7,11,16-24,26-27,33. Наша задача - раскрыть диапазоны чисел 4-7, 16-24 и 26-27, чтобы в итоге получить строку 1,2,4,5,6,7,11,16,17,18,19,20,21,22,23,24,26,27,33.

Есть несколько способов это сделать:

С помощью регулярного выражения:


#!/usr/bin/perl

use strict;
use warnings;

# Исходная строка
my $in = "11,3-6,1,22,25,34,23";
print "IN:  $in\n";

# Преобразование
$in =~ s/(\d+)-(\d+)/join ',', $1..$2/ge;
print "OUT: $in\n"; # 11,3,4,5,6,1,22,25,34,23

С помощью map:


#!/usr/bin/perl

use strict;
use warnings;

# Исходная строка
my $in = "11,3-6,1,22,25,34,23";
print "IN:  $in\n";

# Преобразование
$in = join ",", sort { $a <=> $b } map {
  my ($start, $end) = split /-/, $_, 2; $end ||= $start; $start..$end
} split ',', $in;
print "OUT: $in\n"; # 1,3,4,5,6,11,22,23,25,34

Здесь стоит отметить, что использование регулярных выражений позволяет искать и выполнять определённые действия с подстроками основного текста строки, опираясь на применение специальных метасимволов. В нашем случае они (регулярные выражения) находят и обрабатывают подстроки, например: "4-7", "16-24" и "26-27".