perl で順列を作る

use strict;

my $N = 0;
my @use_number = [];
my @perm = [];
my @result = [];

# 順列生成サブルーチン
sub make_perm_sub
{
	my $n = shift;
	if( $n == $N ){
		push @result, [@perm];
	} else {
		for ( 1..$N ){
			if( not $use_number[$_] ){
				$use_number[$_] = 1;
				$perm[$n] = $_;
				make_perm_sub( $n + 1);
				$use_number[$_] = 0;
			}
		}
	}
}

# 順列生成
sub make_perm
{
	$N = shift;
	make_perm_sub 0;
	return @result;
}

# テストコード
my @ret = make_perm 4;
print "@{$_}\n" for (@ret);