Number :: Range использует ваш синтаксис ..
, но у него нет итератора. Set :: IntSpan использует -
вместо ..
, но имеет с итератором, который упрощает печать набора без создания гигантского массива.
use Set::IntSpan;
my $str = "1..100,171,398..1000";
$str =~ s/\.\./-/g;
my $set = Set::IntSpan->new($str);
for (my $i = $set->first; defined $i; $i = $set->next) {
print "$i\n"; # Or however you'd like to format it
}
Внутри Set :: IntSpan хранит диапазоны, поэтому это должно быть достаточно эффективным с точки зрения памяти. Вы также можете использовать метод spans
для получения проанализированных диапазонов. Это потребует от вас написать немного больше кода, но будет означать, что вам не нужно делать вызов метода для каждого числа в диапазоне. Вызовы методов в Perl немного медленные, но я не стал бы беспокоиться об этом, если только приведенный выше код выполняется слишком долго.