#! /usr/bin/perl -w use strict; sub neighbourhood { my $dim = shift; my @current = (-1) x $dim; my $done = 0; return sub { return if $done; my @res = @current; my $i; ITER: for ($i = 0; $i < scalar @current; ++$i) { if (++$current[$i] > 1 ) { $current[$i] = -1; } else { my $not_origin = 0; ($current[$_] != 0 and $not_origin = 1) for @current; redo ITER unless $not_origin; last; } } $done = 1 if $i >= scalar @current; return @res; } } my $iter = neighbourhood( shift || 3 ); while( my @iter = $iter->() ) { print "@iter\n"; } #### #! /usr/bin/perl -w use strict; sub neighbourhood { my @origin = @_; my $dim = scalar @origin; my @current = (-1) x $dim; my $done = 0; return sub { return if $done; my @res = @current; my $i; for ($i = 0; $i < scalar @current; ++$i) { $res[$i] += $origin[$i]; } ITER: for ($i = 0; $i < scalar @current; ++$i) { if (++$current[$i] > 1 ) { $current[$i] = -1; } else { my $not_origin = 0; ($current[$_] != 0 and $not_origin = 1) for @current; redo ITER unless $not_origin; last; } } $done = 1 if $i >= scalar @current; return @res; } } @ARGV = (6, 2, -4) unless @ARGV; my $iter = neighbourhood( @ARGV ); while( my @iter = $iter->() ) { print "@iter\n"; }