http://www.perlmonks.org?node_id=911986

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

How can we compare two hashed with each other? Currently i am using data compare to compare but i am not able to compare case insensitive data. Please can anyone suggest me how to use Data::Compare for comparison with case insensitive data or is there any other method to compare two hashes given as below,
use strict; use warnings; use Data::Dumper; use Data::Compare; my @array1= ( { 'my_id' => '86091', 'ip' => '2001:DB8:0:0:0:0:0:0/128' }, { 'my_id' => '86091', 'ip' => '2001:DB8:0:0:0:0:0:0/32' } ); my @array2 = ( { 'my_id' => '86091', 'ip' => '2001:DB8:0:0:0:0:0:0/128' }, { 'my_id' => '86091', 'ip' => '2001:db8:0:0:0:0:0:0/32' } ); my $hash1 = \@array1; my $hash2 = \@array2; my $result = compare($hash1, $hash2)?"PASS":"FAIL"; print "Result is $result\n";
how can i lowercase all hashes in first array i.e array1?
  • Comment on How can we compare two hashed with each other for case insensitive data?
  • Download Code

Replies are listed 'Best First'.
Re: How can we compare two hashed with each other for case insensitive data?
by moritz (Cardinal) on Jun 29, 2011 at 15:35 UTC
      Thanks,
Re: How can we compare two hashed with each other for case insensitive data?
by wind (Priest) on Jun 29, 2011 at 22:23 UTC

    If case really doesn't matter, then the best solution is to just initialize the values with lc.

    However, you can also set the values to lc after the fact as well:

    lcvalues(@array1); lcvalues(@array2); sub lcvalues { for (@_) { if (ref $_ eq 'HASH') { lcvalues(values %$_); } elsif (ref $_ eq 'ARRAY') { lcvalues(@$_); } elsif (ref $_) { warn "Unknown data type: " . ref $_; } else { $_ = lc $_; } } }
      yes it worked! Thanks
Re: How can we compare two hashed with each other for case insensitive data?
by d5e5 (Beadle) on Jun 30, 2011 at 15:41 UTC
    You could also use Data::Dumper in Terse mode to transform the contents of your array into a string which you can lc and eval to make all contents, including hash keys and values, lower case.
    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @array1= ( { 'My_ID' => '86091', 'IP' => '2001:DB8:0:0:0:0:0:0/128' }, { 'mY_id' => '86091', 'iP' => '2001:DB8:0:0:0:0:0:0/32' } ); print Dumper(\@array1); print "\nCompare with\n"; @array1 = @{lowercase(\@array1)};#Dereference array ref to array print Dumper(\@array1); sub lowercase{ my $orig_aref = shift; local $Data::Dumper::Terse = 1; #Eliminate '$VAR1 = ' my $string = Dumper($orig_aref); #Stringify contents of data struc +ture my $arefmod = eval lc($string); #Make all data lower case and eval +uate return $arefmod; }
    "It is dangerous to understand new things too quickly." Josiah Warren