in reply to Building hash tree from a data file

Looks like a good case for playing with the input record separator variable ($/). Set that to "---\n", and every time you read with  <> from that file, you'll get a multi-line string, containing the "Main" and all "Sub" blocks.

Then, on each whole record, you can look for the pieces you want via regex matches -- e.g.:

my @name = ( /Name:\s+(.*)/ ); my @find = ( /Find:\s+(.*)/g ); my @text = ( /Text:\s+(.*)/g );
(update: added "g" modifier to get all matches)

In each case, the strings captured by the parens in the regex will be assigned in order of occurrence to the array. (Note that "." in the regex will not match "\n", so each of the "(.*)" captures will extend only to the end of the matched line.)

Then all you need to do is work out how to manage the loading of the hash; it looks like each successive record (delimited by "---") will be a successive layer in the hash. Try some things out, and if you have trouble, post what you have tried.