perl 合并连续数字范围

5tmbdcev  于 2023-08-06  发布在  Perl
关注(0)|答案(3)|浏览(198)

我想在Perl中合并连续的数字范围。Number::Range没有做我所期望的:

use Data::Dumper;
use Number::Range;

say STDERR Dumper(Number::Range->new("1000..5555,5559..9999,5556..5557,5558")->rangeList);

字符串
结果:

$VAR1 = [
          5556,
          5558
        ];
$VAR2 = [
          5559,
          9999
        ];
$VAR3 = [
          1000,
          5555
        ];


我期望:

$VAR1 = [
          1000,
          9999
        ];

voj3qocg

voj3qocg1#

显然,模块在内部以这种方式表示数据。它似乎没有像您希望的那样创建一组合并的数组。
如果在标量上下文中使用range方法,您将看到一个合并的范围字符串:

use Number::Range;
my $range = Number::Range->new("1000..5555,5559..9999,5556..5557,5558");
my $format = $range->range();
print "$format\n";

字符串
印刷品:

1000..9999

pjngdqdw

pjngdqdw2#

模块的方法range在列表上下文中以列表的形式返回范围

say for Number::Range->new("10..12,4,15..18")->range;

字符串
每行打印一个数字,排序。返回标量上下文中的字符串,也是已排序的。
或者,你可以用一个列表/数组构造一个对象(未记录)

my @nums = Number::Range->new(10..12,4,15..18)->range;
say for @nums;


按排序返回。

00jrzges

00jrzges3#

使用替代模块Set::IntSpan

use Set::IntSpan::Fast::XS qw();
say STDERR Set::IntSpan::Fast::XS->new(1000..5555,5559..9999,5556..5557,5558)->as_string;

字符串

相关问题