#!/usr/bin/perl use strict; use warnings; my %sortfkt = ( "item" => \&numerical, "name" => \&string, "age" => \&numerical, "height" => \&numerical, ); my %item1 = ( "item" => 1, "name" => "smith, john", "age" => 25, "height" => 1.80 ); my %item2 = ( "item" => 2, "name" => "jones, bob", "age" => 26, "height" => 1.70 ); my %item3 = ( "item" => 3, "name" => "arrang, eliee", "age" => 27, "height" => 1.75 ); my %hash; $hash{1} = { %item1 }; $hash{2} = { %item2 }; $hash{3} = { %item3 }; my $orderby = "name"; foreach my $id (sort { &{$sortfkt{$orderby}}($hash{$a}{$orderby}, $hash{$b}{$orderby}) } keys %hash) { print "$hash{$id}{'item'} - $hash{$id}{$orderby}\n"; } # end-foreach sub string { return $_[0] cmp $_[1]; } sub numerical { return $_[0] <=> $_[1]; }