$s = "1. ...... AB_CD 1.1 ...... EF_GH 1.2 .... IJ_KL_MN 2. ............ OPQR";; @a = map{ /(\S+)\s+\.+\s+(\S+)/; { chapter => $1, name => $2 } } split '(?<=[^.])\s(?=[^.])', $s;; pp \@a;; [ { chapter => "1.", name => "AB_CD" }, { chapter => "1.1", name => "EF_GH" }, { chapter => "1.2", name => "IJ_KL_MN" }, { chapter => "2.", name => "OPQR" }, ]