You need:
use strict;
use warnings;
use Data::Dumper;
my %a;
$a{'WI'}{'GreenBay'}{'Color'} = 'Black';
foreach my $update ("WI,GreenBay,White") {
my ($state,$city,$color) = split /,/, $update;
my $h = $a{$state}{$city};
$h->{'Color'} = $color;
};
print Dumper(\%a), "\n";
__DATA__
$VAR1 = {
'WI' => {
'GreenBay' => {
'Color' => 'White'
}
}
};
Note that using strictures will catch your spelling error ($updtate) when you split (which is why your hash appears to be empty). Also note that $a{$state}{$city} is already a reference to your "inner hash" (i.e., a hash of hashes already uses a reference).