#!/usr/bin/perl -w use strict; sub combo { my ($k, $array_orig) = @_; my @array = @$array_orig; # copy my @set; if ($k == 1) { @set = map { [$_] } @array; } else { for (0 .. (scalar(@array) - $k)) { my $head = shift @array; push @set, map { [$head, @$_] } @{&combo($k - 1, \@array)}; } } return \@set; } # 実行例 1 print join("\n", map { join(", ", @$_) } @{&combo(3, [1 .. 5])}), "\n\n"; # 実行例 2 print join("\n", map { join(", ", @$_) } @{&combo(3, ["a", "b", "c", "d"])}), "\n\n"; # 実行例 3 my $i = 1; for my $s (@{&combo(6, [1 .. 8])}) { print $i++, "\t", join(", ", @$s), "\n"; }