sub bycreatetime { return $nodes{$a}{createtime} - $nodes{$b}{createtime}; } foreach $node (sort { bycreatetime } keys %nodes) { # ... } #### my (%sort_method) = ( createtime => \&bycreatetime, createuser => \&bycreateuser, # For example ); foreach $node (sort $sort_method{$sort_field} keys %nodes) { # ... } #### 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) { # ... }