use Modern::Perl; use Data::Dumper; my @array; my $str = "1. ...... AB_CD 1.1 ...... EF_GH 1.2 .... IJ_KL_MN 2. ............ OPQR"; while ( $str =~ /(\d+\.\d*)\s+\.+\s+(\S+)\s*/g ) { push @array, { chapter => $1, name => $2 }; } say Dumper \@array;