while ($text =~ m#(?: finance (.*?) end
| <class> (.*?) </class>
| data (.*?) </end>
)
#sgx) {
print $+;
}
должен это сделать.
$+
- последняя группа захвата, которая успешно сопоставлена.
Модификатор /g
предназначен специально для этого вида использования; он превращает регулярное выражение в итератор, который после возобновления продолжает совпадение, в котором он остановился, вместо перезапуска в начале $text
.
(И /x
позволяет вам использовать произвольные пробелы, то есть вы можете сделать свои регулярные выражения читабельными . Или, по крайней мере, настолько читаемыми, насколько они получают.)
Если вам нужно иметь дело с несколькими захватами, это становится немного сложнее, поскольку вы не можете использовать $+
. Тем не менее, вы можете проверить наличие групп захвата define
d:
while ($text =~ m#(?: a (.*?) b (.*?) c
| d (.*?) e (.*?) f
| data (.*?) </end>
)
#sgx) {
if (defined $1) {
# first set matched (don't need to check $2)
}
elsif (defined $3) {
# second set matched
}
else {
# final one matched
}
}