#!/usr/bin/env perl use strict; use warnings; use English qw( -no_match_vars ); use Data::Dumper; my $string = 'foobarbaaaarbaz'; my @second; if (my @matches = $string =~ m{\A (fo*) (?: (?\s*ba+r) (?{push @second, $^N}))+ (\s*ba*z) \z}mxs ) { $matches[1] = \@second; print Dumper \@matches; } # $VAR1 = [ # 'foo', # [ # 'bar', # 'baaaar' # ], # 'baz' # ];