Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Comparing hashes without sorting the keys

by ysth (Canon)
on Feb 18, 2004 at 19:11 UTC ( [id://330017]=note: print w/replies, xml ) Need Help??


in reply to Comparing hashes without sorting the keys

eq applies scalar context to its operands. scalar(%hash) has a special meaning, search for "hash in scalar context" in perldata. If you want to compare the contents, you'll need to do something more complicated.

Data::Dumper, Storable, Test::More, and Test::Differences all do things that are close to what you want, but none seems a perfect fit (and you don't say if you just want to test the keys and values for equality or if you want to descend into the values themselves if they are complex structures.)

Boris's suggestion of Data::Compare seems to be what you want (assuming you want a deep compare or just have a simple hash). It's Compare function returns backward for my taste, though.

Replies are listed 'Best First'.
Re: Re: Comparing hashes without sorting the keys
by DrHyde (Prior) on Feb 19, 2004 at 12:26 UTC
    You want it to return false when they match? Errm, why? Of course, if you really want to turn that around, I'd be happy to accept a patch, including documentation and tests, provided that it maintains backwards combatibility - so it has to be an option that the user explicitly turns on.
      Just following the lead of things like cmp. Better yet, name the function to describe what it returns, e.g. "Differ" or "Match" (so
      if (Match($a,$b) or Differ($c,$d))
      does what it says.

      You're the maintainer of Data::Compare? Interesting. Id very much like to chat with you about this module, specifically with regard to Data::Stream. I say this becuase I have considerable experience with this problem and actually wrote a considerable amount of unreleased code on the subject. I note that Data::Compare fails what I consider to be one of the nastiest test cases that exist in perl data structures. (Another test case is what I call the "dogpound" test originally posted by merlyn which afaik, only Data::Stream handles properly.) Don't feel bad, the only modules that don't fail this test are currently the (unreleased to cpan) Data::Stream and (the released to cpan) Data::BFDump (dont bother with the later, Data::Stream was specifically designed to replace Data::BFDump). Anyway, the test case is as follows:

      use Data::Compare; # this test is called "Scalar Cross" in both the Data::BFDump and Data +::Stream test sets my ($a,$x,$y)=([]); $x=\$y; $y=\$x; $a->[0]=\$a->[1]; $a->[1]=\$a->[0]; print Compare([$x,$y],$a); # infinte loop

      My email is on my homenode, id love to correspond with you about this subject if you're interested.


      cheers
      ---
      demerphq

        First they ignore you, then they laugh at you, then they fight you, then you win.
        -- Gandhi


        Mmmm, tasty bug reports!

        update: fixed in 0.09, will upload to CPAN shortly

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2024-03-29 01:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found