sub NumericalSort { my ($field) = @_; return sub { return $nodes{$a}{$field} - $nodes{$a}{$field}; }; } my (%sort_method) = ( createtime => NumericalSort('createtime'), ); foreach $node (sort $sort_method($sort_field) keys %nodes) { # ... }