Захваченные строки возвращаются в том порядке, в котором они были найдены в шаблоне.
Можно изменить порядок, используя указатели.
/
^ pub \s+ (\S+) \s+
(?= \S+ \s+ .* \s+ .{0,32}(.*) \s+ .* < \S+ > )
(\S+) \s+ .* \s+ .{0,32} .* \s+ (.*) <(\S+)>
/x
Если мы выражаем это в виде строк, мы получаем следующее:
/
^ pub \h++ (\S++) \h++ # Line 1 (part 1)
(?= .*+ \n # Line 1 (part 2)
\h*+ \S*(\S{8}) # Line 2
)
(\S++) .*+ \n # Line 1 (part 2)
.*+ \n # Line 2
(.*\S) \s++ <([^<>\s]++)> # Line 3
/x
(я также сделал так, чтобы неудачи совпадений не совпали по привычке.)
(\S{32}
будет быстрее, чем \S*
, если это приемлемо.)
(я также сделал так, чтобы у четвертого захвата не было завершающих пробелов.)
Тем не менее, гораздо лучшее решение - установить порядок после факта.
@captures = @captures[0,2,1,3,4];
или
@captures[1,2] = @captures[2,1];