Use a tied hash.
package DefaultHash;
sub TIEHASH {
my $class = shift;
my $default = shift;
my $self;
$self->{_DEFAULT} = $default;
$self->{_HASH} = {};
return bless $self, $class;
}
sub FETCH {
my $self = shift;
my $key = shift;
return
exists $self->{_HASH}{$key}
? $self->{_HASH}{$key}
: $self->{_DEFAULT}
}
sub EXISTS {
my $self = shift;
my $key = shift;
return exists $self->{_HASH}{$key};
}
sub FIRSTKEY {
my $self = shift;
my $foo = keys %{$self->{_HASH}}; # Reset each
return each %{$self->{_HASH}};
}
sub NEXTKEY {
my $self = shift;
return each %{$self->{_HASH}};
}
sub CLEAR {
my $self = shift;
$self->{_HASH} = {};
}
sub DELETE {
my $self = shift;
my $key = shift;
return delete $self->{_HASH}{$key};
}
sub STORE {
my $self = shift;
my $key = shift;
my $value = shift;
$self->{_HASH}{$key} = $value;
}
package main;
tie( my %hash, 'DefaultHash', 'a default value' );
%hash = ( a => 1, b => 2, c => 3 );
print "$_ => $hash{$_}\n" for qw(a b c d);