#!/usr/bin/perl use warnings; use strict; use Data::Dumper; my %new_reports = ( 10 => [qw( Test1 Test2 Test3 Test4 Test5 Test6 )], 20 => [qw( Test4 )], ); my @key_to_search = qw( 10 20 ); my @ele_to_delete = qw( Test2 Test4 ); print Dumper(\%new_reports); my %ele_to_delete = map {$_=>1} @ele_to_delete; for my $key ( @key_to_search ) { my $list = $new_reports{$key}; @$list = grep !$ele_to_delete{$_}, @$list; delete $new_reports{$key} if !@$list; } print Dumper(\%new_reports); #### #!/usr/bin/perl use warnings; use strict; use Data::Dumper; my %new_reports = ( 10 => { map {$_=>1} qw( Test1 Test2 Test3 Test4 Test5 Test6 ) }, 20 => { map {$_=>1} qw( Test4 ) }, ); my @key_to_search = qw( 10 20 ); my @ele_to_delete = qw( Test2 Test4 ); print Dumper(\%new_reports); for my $key ( @key_to_search ) { delete @{ $new_reports{$key} }{ @ele_to_delete }; delete $new_reports{$key} if !%{ $new_reports{$key} }; } print Dumper(\%new_reports);