If your hash index is based on value and you utilize anonymous arrays, then you can make your life a lot easier.
For example:
%hash = (x => 0, y => 0, z => "O", a => "O", b => 5, c => 5, d => 6, e
+ => 0.0);
Could look like:
%hash = (0 => [x,y], O => [z,a], 5 => [b,c], 6 => [d], '0.0' => [e]);
And you'd only have to
delete($hash{O});, etc...
If this change in data structure screws your code up, then try to refactor or keep a similarly structured hash as a "look up" for the elements in the actual hash you'd like to delete.