my $old_work = get_initial_work(); # hash reference my $new_work = {}; while (%$old_work) { for my $item (keys %$old_work) { my $job = delete $old_work->{$item}; for (new_work($job)) { $new_work{$item . $_} = $_; } } ($new_work, $old_work) = ({}, $new_work); }