#!/usr/bin/perl use strict; use warnings; my @list = (1 .. 5); my $take = 2; comb_demerphq(\@list, $take, []); sub comb_demerphq { my ($items,$group,$list)=@_; return _comb_demerphq([ @{ $items||[] } ],$ group, [ @{ $list||[] } ] ); } sub _comb_demerphq { my ($items,$group,$list) = @_; unless ($group) { print "@$list\n"; } else { my @newlist = (@$list,undef); while (@$items) { $newlist[-1]=shift (@$items); _comb_demerphq([@$items], $group - 1, \@newlist); } } }