1) можно использовать некоторые примеры того, что вы анализируете.
2) если использовать «x» в конце выражения, вы можете поместить пробел и комментарии в регулярное выражение, чтобы сделать его более понятным
3) Кроме того, разбив его, вы заметите, что во второй части содержимого () отсутствует совпадение с числами ... вместо этого ищется 0 или более '_' и прерывается при увидел цифры, таким образом, не совпадают.
while(<TOCFILE>)
{
$toc_line = $_;
$toc_line =~
s/ # replace the follwoing
<inlineFig # match this text
.*? # then any characters until the next sequence matches
( # throw the match into $1
\.\.\/pics\/ch09_inline99_ # ..\pics\cho9_inline99_
\d*?\.jpg # folowed by 0 or more numbers
)*? # keeping doing that until the next sequence matches
<\/inlineFig> # match this text
/ # with the follwoing
<img src="${1}" alt="" \/\> # some text and the result of $1 above.
/xg; # <- the x makes it ignore whitespace and #comments
$new_toc_file .= $toc_line;
}
4) как уже упоминалось, () *? возвращает только последнее совпадение в $ 1, но это не должно быть проблемой, если ваш ввод будет только определенного формата.