Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: Help in manipulating values from two arrays

by Anno (Deacon)
on Mar 24, 2007 at 09:02 UTC ( #606398=note: print w/replies, xml ) Need Help??


in reply to Help in manipulating values from two arrays

Your output sample shows employee 3379 twice. I'll assume that is an error.

You are assuming you already have a list @inlst of employees, though your code doesn't show where it comes from. The program should probably build the list as it goes along.

Here is one way to do it (__DATA__ section not shown):

use List::Util qw( sum); my (@emp_lst, %prod); while ( <DATA> ) { my ( $emp) = m{<emp>(\d+)</emp>} or warn "No <emp> in line $.\n", next; push @emp_lst, $emp unless $prod{ $emp}; $prod{ $emp} ||= []; my ( $prod) = m{<prod>([.\d]+)</prod>} or next; push @{ $prod{ $emp} }, $prod; } for ( values %prod ) { $_ = @$_ ? sum( @$_)/@$_ : ''; } print "$_ - $prod{ $_}\n" for @emp_lst;
Anno

Update: I agree with GrandFather that an appropriate parser is a better solution.

Update: Noticed an optimisation. The pesky $prod{ $emp} ||= []; can go from the while loop and everything rely on autovivification as it should:

while ( <DATA> ) { my ( $emp) = m{<emp>(\d+)</emp>} or warn "No <emp> in line $.\n", next; push @emp_lst, $emp unless $prod{ $emp}; push @{ $prod{ $emp} }, m{<prod>([.\d]+)</prod>}; }

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2022-11-30 23:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?