Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Generating a list of numbers from other lists

by johngg (Canon)
on Jan 29, 2012 at 23:33 UTC ( [id://950671]=note: print w/replies, xml ) Need Help??


in reply to Generating a list of numbers from other lists

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.

Cheers,

JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://950671]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (6)
As of 2024-04-23 23:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found