Thanks kennethk and tobyink - really helpful.
kennethk: I did think of making the hash into an object as per your first suggestion, but this would mean creating a large number of new packages (I think! The real situation is more complex than the simplified example). Using Hash::Utils is a very good idea though - this does what I need perfectly.
tobyink: nice - this is the kind of Moosey thing I had in mind in the first place. There seem a great many packages which *might* be relevant (to me starting out at least) so its very helpful to know which someone experienced would pick. Congratulations on your 2000th post!