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


in reply to Comparison by position and value

that was too tough for me, so i asked a friend of mine (who is a real perl wizard but not very talkative). my own solution was hash-based too. he gave me this:
use strict; use warnings; print &compatible ("_8__3__19", "48____7__"); #c print &compatible ("_8__3__19", "4_8___7__"); #i print &compatible ("_8__3__19", "48_____7_"); #i sub compatible { my @s=($_[0], $_[1]); my @d; for( 0,1 ) { for( $d[$_]=$s[$_] ) { tr/0-9/\0/c; #assuming the placeholder is not \0 tr/\0/\377/c; } } my $m="$d[0]" & "$d[1]"; for( 0,1 ) { $d[$_] = "$m" & "$s[$_]"; } my $compatible; if( $compatible = $d[0] eq $d[1] ) { for( 0,1 ) { $d[$_] = {}; ${$d[$_]}{$1} .= "$-[0] " while $s[$_] =~ /(\d)/g; } $compatible &= !grep$d[1]->{$_} && $d[1]->{$_} ne $d[0]->{$_}, +keys %{$d[0]}; } return $compatible ? 1 : 0;; }
i canīt say i understand it fully but normally you can rely on ozo