use warnings; use strict; $\ = $/; my $A = 2; my $_0to2 = join '', 0 .. 2; $_ = join '=', ( $_0to2 ) x 2; print "\$_:[$_]"; print /^ \d*(\d)\d* = \d*(\d)\d* (?(?{ my %h; map $h{ $_ } ++, $1, $2; 2 == keys %h }) | (*FAIL) ) (?(?{ $1 < $2 }) | (*FAIL) ) (?(?{ my $sum = $1 + $2; $sum == $A }) | (*FAIL) ) $/x ? "MATCHED: \$1:[$1], \$2:[$2]" : "NOT_MATCHED" ;