Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: Compare Values in HoH

by Herkum (Parson)
on Apr 06, 2006 at 14:48 UTC ( #541647=note: print w/ replies, xml ) Need Help??


in reply to Compare Values in HoH

I think that you are making this too complicated. Lets see if we can understand the real problem, You have two files that have some common fields between them, you want to see which file has something the other file doesn't. Taking your file information from above,

File 1, 1141286452,ServerA,Disk Full,Arb data,other,stuff 1141286737,ServerB,Net Down,Arb data,other,stuff 1141286737,ServerC,Disk Full,Arb data,other,stuff File2, 1141286737,ServerB,Net Down 1141286780,ServerD,Bit Bucket Missing
You can probably boil this down to the data that you want to string that would be,
File 1, 1141286452,ServerA,Disk Full 1141286737,ServerB,Net Down 1141286737,ServerC,Disk Full File2, 1141286737,ServerB,Net Down 1141286780,ServerD,Bit Bucket Missing

Now lets take the data that you want to compare and stick in a hash. The value assigned in the hash relates to which file it came from. 1 means it came from file 1, 2 from file 2 and 3 means from file 1 and 2.

my %index; foreach my $entry (@file1) { if (not exists $index{$entry}) { $index{$entry} = 1 } } foreach my $entry (@file2) { if (not exists $index{$entry}) { $index{$entry} = 2 } else { $index{$entry} += 2; } } foreach my $entry (keys %index) { if ($index{$entry} == 1) { print "Entry $entry is only in file one\n"; } elsif ($index{$entry} == 2) { print "Entry $entry is only in file two\n"; } elsif ($index{$entry} == 3) { print "Entry $entry is in both files\n"; } else { print "Entry $entry is screwed up!\n"; } }

Now you have a hash with all the unique entries and what files that they came from. Which is what I assume that you really want.


Comment on Re: Compare Values in HoH
Select or Download Code
Re^2: Compare Values in HoH
by MidLifeXis (Prior) on Apr 06, 2006 at 18:09 UTC

    Small logic error which you catch after the fact in your output loop.

    Assuming unique values in each file, your loops can be reduced to

    foreach my $entry (@file1) { $index{$entry} = 1 } foreach my $entry (@file2) { $index{$entry} += 2; }

    Not assuming unique values, to avoid "screwed up" entries, it could be reduced to this

    foreach my $entry (@file1) { $index{$entry} = 1 } foreach my $entry (@file2) { # '||0' is to still the warnings under 'use warnings' $index{$entry} += 2 if (($index{$entry}||0) < 2); }

    Nothing big.

    --MidLifeXis

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (18)
As of 2014-08-01 13:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Who would be the most fun to work for?















    Results (20 votes), past polls