I've been struggling to find a non-recursive solution to this, but alas, I have hit the wall. I'm simply trying to loop through all the string combinations from '000' to 'zzzzzzzzzzzzzzzz'. The following code seems to work just fine, but I have a feeling that it'll get ugly once it's dealing with longer and longer strings, hence why I'm looking for the recursion-less fix. If nothing else, I guess I can wrap this up into a package to keep the calling code cleaner. Anyway, here it is:
#!/usr/bin/perl -w use strict; my $number = '000'; do { increment( \$number ); print "$number\n"; } until $number eq 'zzzzzzzzzzzzzzzz'; # or some other long string sub increment { my ( $number_ref ) = @_; my @digits = split //, $$number_ref; unshift @digits, undef while @digits < 16; _increment_digit( \@digits, scalar @digits - 1 ); $$number_ref = join '', grep { defined } @digits; } sub _increment_digit { my ( $array_ref, $index ) = @_; if ( ! defined $array_ref->[$index] ) { $array_ref->[$index] = 0; } elsif ( $array_ref->[$index] ge '0' && $array_ref->[$index] lt '9' + ) { $array_ref->[$index]++; } elsif ( $array_ref->[$index] eq '9' ) { $array_ref->[$index] = 'a'; } elsif ( $array_ref->[$index] ge 'a' && $array_ref->[$index] lt 'z' + ) { $array_ref->[$index] = chr( ord( $array_ref->[$index] ) + 1 ); } elsif ( $array_ref->[$index] eq 'z' ) { $array_ref->[$index] = 0; _increment_digit( $array_ref, ($index - 1) ); } }
"We're experiencing some Godzilla-related turbulence..."
In reply to Iterating through string combinations by patgas
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |