use Data::Dumper; sub dd { print Dumper(shift) }; ("aa2bb4cc6dd8" x 1e3) =~ / (?{ [] }) # initialize $^R (?: (\w\w) (\d) # add captures to $^R: (?{ [@{$^R}, [$1, $2]] }) )* /x; dd @{ $^R }[ -1 ]