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