Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

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', '', '', '<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>', );


Replies are listed 'Best First'.
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', '', '', ], ); 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!


      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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://951499]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (2)
As of 2018-04-22 09:22 GMT
Find Nodes?
    Voting Booth?