#! perl -slw use strict; sub adjSets{ my $min = shift; map { my $start = $_; map { [ @_[ $start .. $start+$_ ] ] } $min-1 .. $#_-$start; } 0 .. $#_ - $min; } sub adjSets2{ my $min = shift; my @rv; for my $start ( 0 .. $#_ - $min ) { for my $len ( $min-1 .. $#_-$start ) { push @rv, [ @_[ $start .. $start+$len ] ]; } } return @rv; } print "@$_" for adjSets( 2, 'A'..'E' );; __END__ c:\test>689189 A B A B C A B C D A B C D E B C B C D B C D E C D C D E