use warnings; use strict; use Algorithm::Odometer::Tiny; my $h = {a=>1, b=>2, c=>3, d=>4}; my $odo = Algorithm::Odometer::Tiny ->new( [sort keys %$h], [sort keys %$h] ); while ( my @x = $odo->() ) { print "outer: $x[0], inner: $x[1]\n"; }