#!/usr/bin/perl
# Idiom #313 Map equality
use strict;
use warnings;
sub hcmp_numeric {
my ( $h , $g ) = @_ ;
die 'non-scalar value detected' }
my $a = { A => 1 , B => 2 , C => 3 } ;
my $b = { A => 1 , B => 2 , C => 3 , D => 4 } ;
my $c = { A => 1 , B => 2 , C => 99 } ;
my $d = { A => 1 , xBx => 2 , C => 3 } ;
my $e = { A => 1 } ;
my $f = { } ;
print 'hcmp(a,a): ' , hcmp_numeric
( $a , $a ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(a,b): ' , hcmp_numeric
( $a , $b ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(a,c): ' , hcmp_numeric
( $a , $c ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(a,d): ' , hcmp_numeric
( $a , $d ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(a,e): ' , hcmp_numeric
( $a , $e ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(a,f): ' , hcmp_numeric
( $a , $f ) ? 'matched' : 'not matched' , "\n " ; print 'hcmp(f,f): ' , hcmp_numeric
( $f , $f ) ? 'matched' : 'not matched' , "\n " ;
use Try:: Tiny ;
my $x = { A => 1 , B => 2 , C => 3 } ;
my $y = { A => 1 , B => [ ] , C => 3 } ;
try {
print 'hcmp(x,y): ' , hcmp_numeric
( $x , $y ) ? 'matched' : 'not matched' , "\n " ; } catch {
} ;
try {
print 'hcmp(y,x): ' , hcmp_numeric
( $y , $x ) ? 'matched' : 'not matched' , "\n " ; } catch {
} ;
try {
print 'hcmp(y,y): ' , hcmp_numeric
( $y , $y ) ? 'matched' : 'not matched' , "\n " ; } catch {
} ;
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMzMTMgTWFwIGVxdWFsaXR5Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgaGNtcF9udW1lcmljIHsKICAgIG15ICgkaCwgJGcpID0gQF87CgogICAgbXkgJGhjID0ga2V5cyAlJGg7CiAgICBteSAkZ2MgPSBrZXlzICUkZzsKCiAgICByZXR1cm4gMCB1bmxlc3MgJGhjID09ICRnYzsKICAgIHJldHVybiAwIHVubGVzcyAkaGMgPT0gZ3JlcCB7IGV4aXN0cyAkZy0+eyRffSB9IGtleXMgJSRoOwogICAgZGllICdub24tc2NhbGFyIHZhbHVlIGRldGVjdGVkJyAKICAgICAgICBpZiAwIDwgZ3JlcCB7IHJlZiAkaC0+eyRffSBvciByZWYgJGctPnskX30gfSBrZXlzICUkaDsKICAgIHJldHVybiAwIHVubGVzcyAkaGMgPT0gZ3JlcCB7ICRoLT57JF99ID09ICRnLT57JF99IH0ga2V5cyAlJGg7CiAgICByZXR1cm4gMTsKfQoKbXkgJGEgPSB7IEEgPT4gMSwgQiA9PiAyLCBDID0+IDMgfTsKbXkgJGIgPSB7IEEgPT4gMSwgQiA9PiAyLCBDID0+IDMsIEQgPT4gNCB9OwpteSAkYyA9IHsgQSA9PiAxLCBCID0+IDIsIEMgPT4gOTkgfTsKbXkgJGQgPSB7IEEgPT4gMSwgeEJ4ID0+IDIsIEMgPT4gMyB9OwpteSAkZSA9IHsgQSA9PiAxIH07Cm15ICRmID0geyB9OwoKcHJpbnQgJ2hjbXAoYSxhKTogJywgaGNtcF9udW1lcmljKCAkYSwgJGEgKSA/ICdtYXRjaGVkJyA6ICdub3QgbWF0Y2hlZCcsICJcbiI7CnByaW50ICdoY21wKGEsYik6ICcsIGhjbXBfbnVtZXJpYyggJGEsICRiICkgPyAnbWF0Y2hlZCcgOiAnbm90IG1hdGNoZWQnLCAiXG4iOwpwcmludCAnaGNtcChhLGMpOiAnLCBoY21wX251bWVyaWMoICRhLCAkYyApID8gJ21hdGNoZWQnIDogJ25vdCBtYXRjaGVkJywgIlxuIjsKcHJpbnQgJ2hjbXAoYSxkKTogJywgaGNtcF9udW1lcmljKCAkYSwgJGQgKSA/ICdtYXRjaGVkJyA6ICdub3QgbWF0Y2hlZCcsICJcbiI7CnByaW50ICdoY21wKGEsZSk6ICcsIGhjbXBfbnVtZXJpYyggJGEsICRlICkgPyAnbWF0Y2hlZCcgOiAnbm90IG1hdGNoZWQnLCAiXG4iOwpwcmludCAnaGNtcChhLGYpOiAnLCBoY21wX251bWVyaWMoICRhLCAkZiApID8gJ21hdGNoZWQnIDogJ25vdCBtYXRjaGVkJywgIlxuIjsKcHJpbnQgJ2hjbXAoZixmKTogJywgaGNtcF9udW1lcmljKCAkZiwgJGYgKSA/ICdtYXRjaGVkJyA6ICdub3QgbWF0Y2hlZCcsICJcbiI7Cgp1c2UgVHJ5OjpUaW55OwoKbXkgJHggPSB7IEEgPT4gMSwgQiA9PiAyICwgQyA9PiAzIH07Cm15ICR5ID0geyBBID0+IDEsIEIgPT4gW10sIEMgPT4gMyB9OwoKdHJ5IHsKICAgIHByaW50ICdoY21wKHgseSk6ICcsIGhjbXBfbnVtZXJpYyggJHgsICR5ICkgPyAnbWF0Y2hlZCcgOiAnbm90IG1hdGNoZWQnLCAiXG4iOwp9IGNhdGNoIHsKICAgIHByaW50ICRfOwp9OwoKdHJ5IHsKICAgIHByaW50ICdoY21wKHkseCk6ICcsIGhjbXBfbnVtZXJpYyggJHksICR4ICkgPyAnbWF0Y2hlZCcgOiAnbm90IG1hdGNoZWQnLCAiXG4iOwp9IGNhdGNoIHsKICAgIHByaW50ICRfOwp9OwoKdHJ5IHsKICAgIHByaW50ICdoY21wKHkseSk6ICcsIGhjbXBfbnVtZXJpYyggJHksICR5ICkgPyAnbWF0Y2hlZCcgOiAnbm90IG1hdGNoZWQnLCAiXG4iOwp9IGNhdGNoIHsKICAgIHByaW50ICRfOwp9Owo=