You should research tie and Tie::Hash

Tie::Hash provides skeletal methods for a hash

Tie::StdHash inherits from Tie::Hash and makes the hash act like your average Perl hash

The package you define just needs to overload the functions that need to act differently than your average hash
So lets write our own Tie::CaseInsensitive class

package Tie::CaseInsensitive; use strict; use Tie::Hash; use vars qw(@ISA); @ISA = qw(Tie::StdHash); sub STORE { my ($self, $key, $value) = @_; return $self->{lc $key} = $value; } sub FETCH { my ($self, $key) = @_; return $self->{lc $key}; } sub EXISTS { my ($self, $key) = @_; return exists $self->{lc $key}; } sub DEFINED { my ($self, $key) = @_; return defined $self->{lc $key}; } 1;

Here's a test program:
#!/usr/bin/perl use Tie::CaseInsensitive; tie %HASH, 'Tie::CaseInsensitive'; $HASH{BoB} = 1; $HASH{bob} = 2; $HASH{BOb} = 3; print "Here are all the key value pairs\n"; foreach(keys %HASH){ print "$_,$HASH{$_}\n"; }

And we should get it to print out:

Here are all the key value pairs
bob,3