my $N = setupSub( %myParameters ); while (defined( my $at = stepSub())) { printf "%d percent done\n", $at/$N; } my $results = resultsSub(); #### my $granularity = 5; sub showProgress { # will be called $granularity+1 times my $at = shift; if ($at == 0) { print "starting\n"; } elsif ($at == $granularity) { print "done\n"; } else { print "$at/$granularity done\n"; } } my $results = mySub(%myParam, progress => { callback => \&showProgress, granularity => $granularity } );