use v5.12; use warnings; use Data::Dump qw(pp); my $cb = sub { say "matched, captured ", pp @_; }; for my $str ("AB","") { for my $re (qr/../, qr/(.)(.)/, qr/(X)?(.)/, qr/XY/, qr/(X)Y/, qr//) { say "--- str <$str> re $re "; if ( my (@caps_0) = ($str =~ $re) ) { my @caps = @caps_0; $#caps = $#- - 1; # reset pseudo capture $cb->(@caps); @caps = @caps_0; no warnings 'uninitialized'; @caps = () if $caps[0] ne $1; # reset pseudo capture $cb->(@caps); } else { say 'NO match'; } say "\n"; } }