my $re = qr/(? (?\w+) (?\s*\d+\s*)* )/x; #### #!/usr/bin/env perl use 5.034; use YAML::XS qw( Dump ); my @digits; my $re = qr{(?{@digits=()}) (?\w+) ( (? \s* \d+ \s*)(?{push @digits, $+{digit}}) )* }x; my $str = 'a 1 2 3 b 4 5 6'; while( $str =~ m{$re}g ) { say qq{$&: '$1'\t}, join( q{|}, @digits ); } exit 0; __END__ oscar:~ 1027> perl refoo.plx a 1 2 3 : 'a' 1 |2 |3 b 4 5 6: 'b' 4 |5 |6