sub last_closed { my $last = $+[0]; my $len = length $^N; for (1 .. $#+) { return $_ if defined($+[$_]) && $+[$_] == $last && $+[$_] == $len + $-[$_]; } return undef; } "ad" =~ m{ ( (a) (?{ print last_closed() }) (b)? (?{ print last_closed() }) (c?) (?{ print last_closed() }) d ) (?{ print last_closed() }) }x;