my @delim = ( ["A", -3, "C"], ["C", -4, "B"] ); my @data = ( ["A", -4, "A"], ["A", -1, "C"], ["C", -4, "D"], ["D", -4, "B"], ["B", -3, "C"], ["C", -2, "B"], ["B", -1, "E"] ); #### #!/usr/bin/perl -l use Algorithm::Loops 'NestedLoops'; my @delim = ... my @data = ... my $N = $#data; my $D = $#delim; NestedLoops( [ [0 .. $N], sub {[$_ .. $N]}, ( sub {[$_+1 .. $N]}, sub {[$_ .. $N]} ) x $D ], { OnlyWhen => sub { return 0 if @_ < 2*@delim; for my $d (0 .. $D) { return 0 if $data[ $_[ $d*2 ] ][0] ne $delim[$d][0] or $data[ $_[ $d*2 + 1 ] ][2] ne $delim[$d][2] } return 1; } }, sub { my @ranges = map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D; print join " / ", map { my $range = $_; join " ", map "[@$_]", @$range } @ranges; } ); #### NestedLoops( [ [0 .. $N], sub {[$_ .. $N]}, ( sub {[$_+1 .. $N]}, sub {[$_ .. $N]} ) x $D ], #### for my $i0 ( 0 .. $N ) { for my $i1 ( $i0 .. $N ) { for my $i2 ( $i1+1 .. $N ) { for my $i3 ( $i2 .. $N ) { ... #### { OnlyWhen => sub { return 0 if @_ < 2*@delim; for my $d (0 .. $D) { return 0 if $data[ $_[ $d*2 ] ][0] ne $delim[$d][0] or $data[ $_[ $d*2 + 1 ] ][2] ne $delim[$d][2] } return 1; } }, #### sub { my @ranges = map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D; print join " / ", map { my $range = $_; join " ", map "[@$_]", @$range } @ranges; } #### [A -4 A] [A -1 C] / [C -4 D] [D -4 B] [A -4 A] [A -1 C] / [C -4 D] [D -4 B] [B -3 C] [C -2 B] [A -4 A] [A -1 C] / [C -2 B] [A -4 A] [A -1 C] [C -4 D] [D -4 B] [B -3 C] / [C -2 B] [A -1 C] / [C -4 D] [D -4 B] [A -1 C] / [C -4 D] [D -4 B] [B -3 C] [C -2 B] [A -1 C] / [C -2 B] [A -1 C] [C -4 D] [D -4 B] [B -3 C] / [C -2 B] #### my @intervals = NestedLoops( .. sub { return [ map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D ] } );