sub localised_hashvalue { package localised::hashvalue; my ($ref, $key, $value) = @_; my $exist = exists $ref->{$key}; my $old = $ref->{$key}; $ref->{$key} = $value; return bless [$ref, $key, $exist, $old]; sub DESTROY { my ($ref, $key, $exist, $old) = @{+shift}; $ref->{$key} = $old; delete $ref->{$key} if !$exist; } }