use strict; my %hash = ( 1 => 'angel', 2 => 'buffy', 3 => 'cordelia', 4 => 'dawn', 5 => 'ethan', 6 => 'faith', 7 => 'giles' ); reorder(5,'up'); # ethan moves up: swaps place with dawn display(); sub reorder(){ my ($item,$direction) = @_; if($direction eq 'up'){ # coming soon -- 'down' my $tmp = $hash{$item}; # save ethan $hash{$item} = $hash{ ($item -1) }; # move dawn down to 5 $hash{ ($item -1) } = $tmp; # put ethan back as 4 } } sub display { print '-' x 30,"\n"; foreach my $key (sort (keys (%hash))) { printf("%12s is now number %d\n",$hash{$key},$key); } print '-' x 30,"\n"; } #### sub reorder(){ my ($item,$direction) = @_; if($direction eq 'up'){ $hash{$item,($item -1)} = $hash{ ($item -1), $item}; # maybe perl can automagically do the $tmp thing for me? } } #### ------------------------------ angel is now number 1 buffy is now number 2 cordelia is now number 3 dawn is now number 4 ethan is now number 5 is now number 5 faith is now number 6 giles is now number 7 ------------------------------