my $possibilities = 2 ** $N; # $N is number of dimensions # @mypos is my coordinates. for (1 .. $possibilities) { # using 0 would return my own position my $binary = sprintf '%b', $_; my $pad= '0' x ($N - length $binary); $binary = $pad.$binary; my @shift = split //, $binary; my @pos = map {$mypos[$_] - $shift[$_]} 0 .. $#mypos; push @neighbours, \@pos; }