use warnings; use strict; use feature 'say'; use Data::Dumper; $Data::Dumper::Terse = $Data::Dumper::Indent = $Data::Dumper::Sortkeys = 1; $Data::Dumper::Quotekeys = 0; my $in = get_input(); my %out; for my $id (keys %{ $in }) { for my $state (keys %{ $in->{$id} }) { $out{$state} = { map { split '=' } @{ $in->{$id}{$state} } }; }; } say 'Transformed input: ', Dumper \%out; say 'All states: ', Dumper [map { $_->{state_name} } values %out]; say 'Commented: ', Dumper [map { $_->{state_name} } grep { $_->{comments} } values %out]; #---------------------------------------------------------# sub get_input { return { 99155 => { PR => [ 'state_name=Puerto Rico', 'county_names_all=Adjuntas|Utuado', ], AK => [ 'state_name=Alaska', 'county_names_all=Ketchikan Gateway|Prince of Wales-Hyder', ], WA => [ 'state_name=Washington', 'county_names_all=Pend Oreille|Spokane|Lincoln|Adams', 'comments=America/Los_Angeles', ], }, 26134 => { WV => [ 'state_name=West Virginia', 'county_names_all=Wirt|Wood|Jackson|Ritchie|Calhoun', 'comments=America/New_York', ], }, }; } #### Transformed input: { AK => { county_names_all => 'Ketchikan Gateway|Prince of Wales-Hyder', state_name => 'Alaska' }, PR => { county_names_all => 'Adjuntas|Utuado', state_name => 'Puerto Rico' }, WA => { comments => 'America/Los_Angeles', county_names_all => 'Pend Oreille|Spokane|Lincoln|Adams', state_name => 'Washington' }, WV => { comments => 'America/New_York', county_names_all => 'Wirt|Wood|Jackson|Ritchie|Calhoun', state_name => 'West Virginia' } } All states: [ 'Alaska', 'Washington', 'Puerto Rico', 'West Virginia' ] Commented: [ 'Washington', 'West Virginia' ]