gen( 5, 50, 0, sub { print "@_\n" } ); sub gen { my( $cols, $max, $used, $found, @vec ) = @_; return $found->( @vec, $max-$used ) if $cols == 1; gen( $cols-1, $max, $used+$_, $found, @vec, $_ ) for 0 .. $max-$used; }