#! /usr/local/bin/perl -w use strict; my @nuc = qw/ A T C G /; sub inc { $_[0] eq 'A' and return 'T'; $_[0] eq 'T' and return 'C'; return 'G'; } sub gen { my @current = @_; my $done = 0; return sub { return if $done; my @res = @current; my $i; ITER: for ($i = 0; $i < scalar @current; ++$i) { if( $current[$i] ne $nuc[-1] ) { $current[$i] = inc($current[$i]); last; } else { $current[$i] = $nuc[0]; } } $done = 1 if $i >= scalar @res; return @res; } } my @set = ('A') x (shift || 3); my $iter = gen( @set ); while( my @iter = $iter->() ) { print "@iter\n"; }