Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

intersecting two hashes

by bsherkhane (Initiate)
on Jan 26, 2016 at 07:03 UTC ( [id://1153642]=perlquestion: print w/replies, xml ) Need Help??

bsherkhane has asked for the wisdom of the Perl Monks concerning the following question:

dear monks, i am a novice perl programmer, my question: I have two csv files , where 1 file is a database , the other is the query file. each line of the file has key and value, i want to check if the key value of database matches with key value of query? how to go about it, inshort how to intersect two hashes ?

Replies are listed 'Best First'.
Re: intersecting two hashes
by Athanasius (Archbishop) on Jan 26, 2016 at 07:56 UTC

    Hello bsherkhane,

    As Anonymous Monk says, if this is a database question, then hashes aren’t needed.

    However, if you do have two hashes and want to find their intersection, just remember that the keys of a hash are accessible as a list via the Perl built-in keys function. So you really want the intersection of two lists, and this is an FAQ: see perlfaq4#How-do-I-compute-the-difference-of-two-arrays?-How-do-I-compute-the-intersection-of-two-arrays?

    Update: The logic is actually simpler with hashes: because each key can occur only once in a given hash, you only need to determine whether an entry corresponding to each key in the first hash exists in the second:

    use strict; use warnings; use Data::Dump; my %hash1 = ( a => 1, b => 2, c => 3, ); my %hash2 = ( b => 4, e => 5, f => 6, c => 7, ); my %intersection; for my $key (keys %hash1) { $intersection{$key} = [ $hash1{$key}, $hash2{$key} ] if exists $hash2{$key}; } dd \%intersection;

    Output:

    18:00 >perl 1527_SoPW.pl { b => [2, 4], c => [3, 7] } 18:01 >

    (Of course, you’ll have to decide what to do when the values differ. I’ve just included both values in an anonymous array.)

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Alternatively, you could find just the keys shared by both hashes using grep

      use v5.22; use warnings; my %hash1 = ( a => 1, b => 2, c => 3, ); my %hash2 = ( b => 4, e => 5, f => 6, c => 7, ); my @results = grep { exists $hash2{$_} } keys %hash1; say join ',',@results; #b,c
Re: intersecting two hashes
by Corion (Patriarch) on Jan 26, 2016 at 08:54 UTC

    Also see perlfaq4, which adresses the problem of finding the common elements of two structures.

Re: intersecting two hashes ( DBD::CSV)
by Anonymous Monk on Jan 26, 2016 at 07:35 UTC

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (3)
As of 2024-04-20 04:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found