Class for hashes with key-casing requirements supporting defaults version 0.05
use Hash::WithDefaults; %main = ( ... ); tie %h1, 'Hash::WithDefaults', {...}; tied(%h1)->AddDefault(\%main); tie %h2, 'Hash::WithDefaults', [...]; tied(%h2)->AddDefault(\%main); # now if you use $h1{$key}, the value is looked up first # in %h1, then in %main.
This module implements hashes that support \*(L"defaults\*(R". That is you may specify several more hashes in which the data will be looked up in case it is not found in the current hash.
tie %hash, 'Hash::WithDefault', [$case_option], [\%values]; tie %hash, 'Hash::WithDefault', [$case_option], [\@values]; tie %hash, 'Hash::WithDefault', [$case_option], [%values];
The optional $case_option may be one of these values:
Sensitive - the hash will be case sensitive Tolower - the hash will be case sensitive, all keys are made lowercase Toupper - the hash will be case sensitive, all keys are made uppercase Preserve - the hash will be case insensitive, the case is preserved Lower - the hash will be case insensitive, all keys are made lowercase Upper - the hash will be case insensitive, all keys are made uppercase
If you pass a hash or array reference or an even list of keys and values to the tie() function, those keys and values will be \s-1COPIED\s0 to the resulting magical hash!
After you tie() the hash, you use it just like any other hash.
AddDefault
tied(%hash)->AddDefault(\%defaults);
This instructs the object to include the %defaults in the search for values. After this the value will be looked up first in %hash itself and then in %defaults.
You may keep modifying the %defaults and your changes \s-1WILL\s0 be visible through %hash!
You may add as many defaults to one Hash::WithDefaults object as you like, they will be searched in the order you add them.
If you delete a key from the tied hash, it's only deleted from the list of specific keys, the defaults are never modified through the tied hash. This means that you may get a default value for a key after you deletethe key from the tied hash!
GetDefaults
$defaults = tied(%hash)->GetDefaults(); push @$defaults, \%another_default;
Returns a reference to the array that stores the defaults. You may delete or insert hash references into the array, but make sure you \s-1NEVER\s0 \s-1EVER\s0 insert anything else than a hash reference into the array!
use Config::IniHash; $config = ReadIni $inifile, withdefaults => 1, case => 'preserve';
if (exists $config->{':default'}) { my $default = $config->{':default'}; foreach my $section (keys %$config) { next if $section =~ /^:/; tied(%{$config->{$section}})->AddDefault($default) } }
And now all normal sections will get the default values from [:default] section ;-)
Jan Krynicky <[email protected]> http://Jenda.Krynicky.cz
Copyright (c) 2002-2009 Jan Krynicky <[email protected]>. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.