Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在perl中,如何从区间数组中获取补码区间?_Arrays_Perl_Intervals - Fatal编程技术网

Arrays 在perl中,如何从区间数组中获取补码区间?

Arrays 在perl中,如何从区间数组中获取补码区间?,arrays,perl,intervals,Arrays,Perl,Intervals,解释我的疑问最简单的方法是举个例子。。。以下是: 我在perl中有一个数组,带有一组区间,我需要获得互补区间,换句话说,该区间的反映像。发件人: @ary1=qw(23-44 85-127 168-209) 打印间隔:23-44、85-127、168-209 将其转换为: …-22,45-84128-167210- 非常感谢您的考虑 如果间隔已排序且不重叠: #!/usr/bin/perl use warnings; use strict; use List::MoreUtils qw{ n

解释我的疑问最简单的方法是举个例子。。。以下是:

我在perl中有一个数组,带有一组区间,我需要获得互补区间,换句话说,该区间的反映像。发件人:

@ary1=qw(23-44 85-127 168-209)

打印间隔:23-44、85-127、168-209

将其转换为:

…-22,45-84128-167210-

非常感谢您的考虑


如果间隔已排序且不重叠:

#!/usr/bin/perl
use warnings;
use strict;

use List::MoreUtils qw{ natatime };

my @ary1 = qw(23-44 85-127 168-209);

my $diff = 1;
my $pair = natatime 2, '...', 
                       map({ map { $diff *= -1; $_ + $diff }
                                 split /-/
                           } @ary1),
                       '...';
my @compl;
while (my ($from, $to) = $pair->()) {
    push @compl, "$from-$to";
}

print "@compl\n";
输出

...-22 45-84 128-167 210-...
[["...", 22], [45, 84], [128, 167], [210, "..."]]
...-22, 45-84, 128-167, 210-...

您可能更喜欢此解决方案,其工作原理与
@Choroba
中的答案类似

我已经使用
Data::Dump
print
显示了生成的
@对
数组,前者显示了数组的内容,以防需要进一步处理,后者输出符合问题要求的文本

use strict;
use warnings;

my @input = qw/ 23-44 85-127 168-209 /;

my $begin;
my @pairs;

for (@input) {
  next unless /(\d+)-(\d+)/;
  push @pairs, [ $begin // '...', $1-1 ];
  $begin = $2+1;
}
push @pairs, [ $begin, '...' ];



use Data::Dump;
dd \@pairs;

print join(', ', map join('-', @$_), @pairs), "\n";
输出

...-22 45-84 128-167 210-...
[["...", 22], [45, 84], [128, 167], [210, "..."]]
...-22, 45-84, 128-167, 210-...

如果给定的集合包含-Inf或+Inf,则所提供的解决方案都不起作用,例如:
(“…-22”、“45-84”、“128-167”、“210-…”)

如果间隔已排序且不重叠,且数据始终符合给定语法,则以下解决方案也适用于上述情况(与
@Borodin
提供的解决方案非常相似):


说你没有关于该地区的信息,这似乎对我必须解决的一些具体案例是正确的,谢谢!