Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: Compare Values in HoH

by Herkum (Parson)
on Apr 06, 2006 at 14:48 UTC ( [id://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.

Replies are listed 'Best First'.
Re^2: Compare Values in HoH
by MidLifeXis (Monsignor) 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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://541647]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2024-04-25 04:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found