http://qs1969.pair.com?node_id=871536


in reply to Ignore Case when comparing Hash Keys

First transform one of the hashes to use all lowercase keys. Then check existence of lc $other_key.

Here's a Perl 6 solution:

my %lc1 = %hash1.keys>>.lc Z %hash1.values; for %hash2.keys -> $k { say "$k ", %lc1.exists($k) ?? 'Matched' !! 'Did not match'; }

Transforming the code to Perl 5 shouldn't be too hard.

Replies are listed 'Best First'.
Re^2: Ignore Case when comparing Hash Keys
by avidcoder (Novice) on Nov 15, 2010 at 18:56 UTC
    I cant convert the Hash Keys to lower case, because I want to display the Keys and Values Side by side in the output and I want to keep the original Case of the Keys. I was wondering if there is something like if ($a =~ /$search/i) kind of comparison that ignores the case and matches the keys. Also I want the hash to give me the value of the key

      avoidcoder:

      I don't advise it, but you could do something like:

      %hash1 = ("John", 43, "Paul", 25, "Marie", 22); %hash2 = ("john", 43, "Paul", 25, "marie", 22); while (($KEY_2, $VALUE_2) = each %hash2){ if (grep { m/$KEY_2/i } keys %hash1) { print "$KEY_2 : Matched\n"; } else{ print "$KEY_2 : Did not match\n"; } }

      Note: Untested, you can keep all the bits when it breaks, etc.

      ...roboticus

        Robotics Thanks. This works in Key Comparison but how do i get the value of the corresponding Key in the if block? Thanks again.
      I cant convert the Hash Keys to lower case, because I want to display the Keys and Values Side by side in the output and I want to keep the original Case of the Keys.

      Then use another hash that maps lower case key to the correctly cased key.

      Also note that the original hash with the correctly cased keys still exists, and stands at your disposal.