in reply to numerical and non numerical sorts

ugly, but this will do:
  1. add a sort function hash
    my %sortfkt = ( "item" => \&numerical, "name" => \&string, "age" => \&numerical, "height" => \&numerical, );
  2. add the functions
    sub string { return $_[0] cmp $_[1]; } sub numerical { return $_[0] <=> $_[1]; }
  3. change the sort
    sort { &{$sortfkt{$orderby}}($hash{$a}{$orderby}, $hash{$b}{$orderby}) + } keys %hash
putting it together:
#!/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}, $has +h{$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]; }

$\=~s;s*.*;q^|D9JYJ^^qq^\//\\\///^;ex;print