If you read the "looking for" file into an array you can use it to construct a regular expression that selects only the lines you want and captures the two numeric elements. It also means you don't have to do any sorting because the array is already in the order you desire. I use a single HoH (hash of hashes) to hold the lines and also the sum of the second terms.
use strict;
use warnings;
use 5.010;
use Data::Dumper;
open my $lookFH, q{<}, \ <<EOD or die qq{open: << HEREDOC: $!\n};
20
30
50
EOD
chomp( my @lookFor = <$lookFH> );
my $lookForRE = do{
local $" = q{|};
qr{^(@lookFor)\s+(\d+)}
};
my %accumulate;
open my $nosFH, q{<}, \ <<EOD or die qq{open: << HEREDOC: $!\n};
10 23432
20 23424
60 45567
20 56756
30 91857
50 29349
10 93729
80 82374
20 82757
30 92785
50 71674
70 81747
20 83758
30 89275
10 19594
60 09214
20 09347
50 83725
90 91845
20 76402
30 90184
EOD
while ( <$nosFH> )
{
next unless m{$lookForRE};
chomp;
push @{ $accumulate{ $1 }->{ lines } }, $_;
$accumulate{ $1 }->{ sum } += $2;
}
foreach my $group ( @lookFor )
{
say join q{ },
$_,
$accumulate{ $group }->{ sum }
for @{ $accumulate{ $group }->{ lines } }
}
print Data::Dumper->Dumpxs(
[ \ %accumulate ],
[ qw{ *accumulate } ]
);
Here is the output. I have included the Data::Dumper->Dumpxs() representation of the hash to show the resulting data structure.
20 23424 332444
20 56756 332444
20 82757 332444
20 83758 332444
20 09347 332444
20 76402 332444
30 91857 364101
30 92785 364101
30 89275 364101
30 90184 364101
50 29349 184748
50 71674 184748
50 83725 184748
%accumulate = (
'50' => {
'lines' => [
'50 29349',
'50 71674',
'50 83725'
],
'sum' => '184748'
},
'30' => {
'lines' => [
'30 91857',
'30 92785',
'30 89275',
'30 90184'
],
'sum' => '364101'
},
'20' => {
'lines' => [
'20 23424',
'20 56756',
'20 82757',
'20 83758',
'20 09347',
'20 76402'
],
'sum' => '332444'
}
);
I hope this is helpful.