in reply to map2 {} grep2 {} ...

The solutions offered so far are very sophisticated, but I think the most stupid way is also the most readable:

my %h_prefixed; my %h_numbers; while(my ($key, $val) = each %h) { $h_numbers{$key} = $val if looks_like_a_number($val); $h_prefixed{$key} = "p$val"; }

And it's (probably) not even slower or anything.

For a (maybe a bit) less readable solution, I'd like to offer the following:

my %h_prefixed; @h_prefixed{keys %h} = map "p$_", values %h;