in reply to Re-orderable keyed access structure?
#!perl use strict; use warnings; my (@array, %hash); sub push_item { # push_item(key => value) return 0 if defined $hash{$_[0]}; push @array, [$_[1], $_[0], scalar @array]; $hash{$_[0]} = $array[-1]; return 1; } sub swap_array { # swap_array(index1, index2) @array[$_[0], $_[1]] = @array[$_[1], $_[0]]; ($array[$_[0]]->[2], $array[$_[1]]->[2]) = ($array[$_[1]]->[2], $array[$_[0]]->[2]); } sub get_array_pos_by_key { # get_array_pos_by_key(key) return undef unless exists $hash{$_[0]}; $hash{$_[0]}->[2]; } sub get_hash_key_by_index { # get_hash_key_by_index(index) return undef unless $_[0] < @array; $array[$_[0]]->[1]; } # populate push_item('foo' => 'bar'); push_item('joe' => 'banana'); push_item('foe' => 'friend'); push_item('gin' => 'tonic'); push_item('ice' => 'age'); print get_array_pos_by_key('gin'), "\n"; print get_array_pos_by_key('joe'), "\n"; print $hash{'gin'}->[0], ' ', $hash{'joe'}->[0], "\n"; print $array[3]->[0], ' ', $array[1]->[0], "\n"; swap_array(get_array_pos_by_key('gin'), get_array_pos_by_key('joe')); print get_array_pos_by_key('gin'), "\n"; print get_array_pos_by_key('joe'), "\n"; print $hash{'gin'}->[0], ' ', $hash{'joe'}->[0], "\n"; print $array[3]->[0], ' ', $array[1]->[0], "\n";
|
|---|