G'day herman4016,
You're reading the input line by line; accordingly, your regex is only trying to match against the single line in $_ for any given iteration of the while loop.
What you need to do is read the input in records. You can do this by locally setting $/, the input record sparator (see "perlvar: Variables related to filehandles").
You didn't post your data in <code>...</code> tags (in fact, you appear to have "<p>...</p>" tags with embedded "<br />" tags and what looks like extraneous whitespace), so I'm having to guess what it really looks like. In the script below, I've assumed paragraph mode (records are separated by two or more blank lines) but maybe "ENDEL;" might be a better end-of-record indicator.
You have an additional problem in your posted regex with greedy matches (e.g. " .*"). If you don't understand that, see Quantifiers under "perlre: Regular Expressions".
The following script shows the technique you'll need. You may need to adjust this based on my various comments above.
#!/usr/bin/env perl -l use strict; use warnings; my $re = qr{TEXT;\s+LAYER 13[1-7];\s+TEXTTYPE 0;.*?STRING ([^;]+)}s; { local $/ = ""; while (<DATA>) { print $1 if /$re/; } } __DATA__ ... ... TEXT; LAYER 133; TEXTTYPE 0; PRESENTATION 0,2,0; STRANS 0,0,0; XY 1; X: 91410; Y: 50020; STRING AVDD12; ENDEL; BOUNDARY; LAYER 108; DATATYPE 0; XY 5; X: 0; Y: 0; X: 0; Y: 53530; X: 91410; Y: 53530; X: 91410; Y: 0; X: 0; Y: 0; ENDEL; ... ...
Output:
AVDD12
-- Ken
In reply to Re: how to write multi-line regex
by kcott
in thread how to write multi-line regex
by herman4016
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |