You'd like to have a hash whose keys or values can't be altered once set.
Use the appropriate functions from the standard Hash::Util module.
use Hash::Util qw{ lock_keys unlock_keys lock_value unlock_value lock_hash unlock_hash };
To restrict access to keys already in the hash, so no new keys can be introduced:
lock_keys(%hash); # restrict to current keys lock_keys(%hash, @klist); # restrict to keys from @klist
To forbid deletion of the key or modification of its value:
lock_value(%hash, $key);
To make all keys and their values read-only:
lock_hash(%hash);
Suppose you're using a hash to implement a record (or an object) with some pre-determined set of keys, such as "NAME", "RANK", and "SERNO". You'd like to consider it an error to access any keys besides the ones initially in the hash, such as "ANME", a typo. Because Perl always creates hash elements on demand, this wouldn't be caught the way it would if you misspelled a variable name while under the use strict pragma.
The Hash::Util module's lock_keys function takes care of this for you. Once a hash is marked as having locked keys, you can't use any other keys than those. The keys need not yet be in the hash, and they may still be deleted if they are. But no new keys may be used.
Access to the values in those locked keys is not restricted by lock_keys. However, you may use the lock_value function to render a value in a hash read-only. That hash can also have its keys locked, but doesn't need to if the goal is just to have one or more values marked read-only.
If you want to lock down the entire hash, thereby restricting both its keys and its values, the lock_hash function will do.
The documentation for the Hash::Util module
Copyright © 2003 O'Reilly & Associates. All rights reserved.