Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Comparing Hash key with array

by Riales (Hermit)
on Feb 02, 2012 at 17:21 UTC ( #951499=note: print w/ replies, xml ) Need Help??


in reply to Comparing Hash key with array

Can you clarify what the resulting hash should look like?

Are you saying that after iterating through each key of the hash, you should have:

my @dir1 =('_W9C2JJDCB', '201200240', 'TEST: IGNORE', 'John Doe', 'Closed', 'HIP', 'email@email.com', 'email2@email.com', '<P>This is the problem1.</P>', '<P>This is res1</P>', '<P>This is the problem2.</P>', '<P>This is res2</P>', '<P>This is the problem3.</P>', '<P>This is res3</P>', );

?


Comment on Re: Comparing Hash key with array
Download Code
Re^2: Comparing Hash key with array
by packetstormer (Monk) on Feb 02, 2012 at 17:25 UTC
    Yep, that is exactly what I would like to end up with.

    Sorry for the confusion I am having trouble getting my head around the data structure itself but what you said above seems to be correct. - Thanks

      This should work:

      use Data::Dumper; my @lines = ( ['_W9C2JJDCB', 'asdf1', 'zxcv1', ], ['_W9C2JJDCB', 'asdf2', 'zxcv2', ], ['_W9C2JJDCB', 'asdf3', 'zxcv3', ], ); my %hash = ( '_W9C2JJDCB' => [ '_W92CJJDCB', '201200240', 'TEST: IGNORE', 'John Doe', 'Closed', 'HIP', 'email@email.com', 'email2@email.com', ], ); foreach my $key (keys %hash) { foreach my $line (@lines) { if ($line->[0] eq $key) { shift @$line; push @{$hash{$key}}, @$line; } } } die Dumper(%hash);

      I don't know what your input data looks like, but may I suggest iterating through @lines instead of keys %hash in the outer loop? This way, you can use the hash's look-up to check if there's a match. Your way is better if there's a massive amount of data in @lines that doesn't have a match in %hash though. Let me know if you'd like some help with the other way!

      EDIT: I TAKE BACK WHAT I SAID

      You should definitely iterate through @lines first no matter what; it's far more efficient:

      foreach my $line (@lines) { my $key = shift @$line; if (exists($hash{$key})) { push @{$hash{$key}}, @$line; } }

        Excellent! Thanks, that works as I want.
        It turns out my original code, albeit verbose, almost works when I change that "==" to "eq". One of those things were you can't see the wood for the trees!

        Thanks for the tip regarding iterating through @lines. There will be an huge amount of data in there when it goes live.

        Thanks again

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2014-08-28 04:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (256 votes), past polls