This goes through the same steps as the functional version but doesn't use much functional programming (and so is probably more efficient):
#!/usr/bin/perl -w
use strict;
sub gen {
my %list;
@list{@_}= map [1], 0..$#_;
return sub {
my @next;
for my $m ( keys %list ) {
if( ! @next || $list{$m}[0] < $list{$next[0]}[0] ) {
@next= $m;
} elsif( $list{$m}[0] == $list{$next[0]}[0] ) {
push @next, $m;
}
}
my $ret= $list{$next[0]}[0];
for my $m ( @next ) {
shift @{$list{$m}};
}
for my $m ( keys %list ) {
push @{$list{$m}}, $ret*$m;
}
return $ret;
};
}
@ARGV= (2,3,5) if ! @ARGV;
my $iter= gen(@ARGV);
print $iter->(), $/ while 1;
Ever notice that converting a functional program to a procedural one is a bit like doing a Fourier transform? (: I supposed I shouldn't be using a closure with such a claim, but they make convenient one-method objects.