use Data::Dumper; my %hash = ( ABC => 'foo', DEF => 'bar', XXX => 'baz', YYY => 'quux', ); my %casehash; for(keys %hash) { $casehash{CaseA}->{$_} = $hash{$_} if /^[A-F]+\z/; $casehash{CaseZ}->{$_} = $hash{$_} if /^[W-Z]+\z/; } print Dumper(\%casehash); __output__ $VAR1 = { 'CaseA' => { 'ABC' => 'foo', 'DEF' => 'bar' }, 'CaseZ' => { 'XXX' => 'baz', 'YYY' => 'quux' } };