sub by_hashval_func { my ( $hashref ) = @_; return sub { $hashref->{ $a } cmp $hashref->{ $b } }; } foreach my $key ( sort by_hashval_func( \%hash ) keys %hash ) { # do something useful } #### sub by_hashval_func { my ( $hashref ) = @_; return sub($$) { $hashref->{ $_[0] } cmp $hashref->{ $_[1] } }; }