my $max_weight = 10; my %items = ( # value, weight: positive integers 'a' => { v => 1, w => 2 }, 'b' => { v => 11, w => 9 }, ); #### first half second half $1 $2 attempt 1: v vvvvvvvvvvv --> ww + wwwwwwwww = 11, not enough w's! backtrack attempt 2: v --> ww = 2, enough w's for this, so accepted #### # used to be: # my $re = sprintf "%s0\n(?=\n%s)\n", $left, $right; use Data::Dumper; my $re = sprintf qq[%s0\n(?{ print "trying " . Dumper \\%%+})\n(?=\n%s)\n], $left, $right; print $re; #### STRING: vvvvvvvvvvvv0wwwwwwwwww REGEX: (?(?:vvvvvvvvvvv)?) (?(?:v)?) 0 (?{ print "trying " . Dumper \%+}) (?= (?(?{ $1 })wwwwwwwww|) (?(?{ $2 })ww|) ) OUTPUT: trying $VAR1 = { 'a' => 'v', 'b' => 'vvvvvvvvvvv' }; trying $VAR1 = { 'a' => '', 'b' => 'vvvvvvvvvvv' }; #### STRING: vvvvvvvvvvvv0wwwwwwwwww REGEX: (?(?:v)?) (?(?:vvvvvvvvvvv)?) 0 (?{ print "trying " . Dumper \%+}) (?= (?(?{ $1 })ww|) (?(?{ $2 })wwwwwwwww|) ) OUTPUT: trying $VAR1 = { 'a' => 'v', 'b' => 'vvvvvvvvvvv' }; trying $VAR1 = { 'a' => '', 'b' => 'vvvvvvvvvvv' }; #### ^ (?(?:v)?) (?(?:vvvvvvvvvvv)?) v* 0 #### (?(?:v)?) (?(?:vvvvvvvvvvv)?) 0