Я не большой специалист по Perl, так что, возможно, есть более быстрый путь к этому, но кажется, что вам нужен оператор соответствия "//
" в контексте списка. Когда вы присваиваете результат операции сопоставления списку, оператор сопоставления принимает контекст списка и возвращает список с каждым из подвыражений, разделенных скобками. Если вы укажете глобальные совпадения с флагом "g
", он вернет список всех совпадений каждого подвыражения. Пример:
# print a list of each match for "x" in "xxx"
@aList = ("xxx" =~ /(x)/g);
print(join(".", @aList));
Распечатает
x.x.x
Я предполагаю, что у вас есть регулярное выражение для каждого из этих 5 типов h
, D
, s
, E
и x
. Вы не сказали, является ли каждая из этих частей одним или несколькими символами, поэтому я предполагаю, что они могут состоять из нескольких символов. Если это так, ваше решение может выглядеть примерно так:
$h = ""; # Insert regex to match "h"
$D = ""; # Insert regex to match "D"
$s = ""; # Insert regex to match "s"
$E = ""; # Insert regex to match "E"
$x = ""; # Insert regex to match "x"
$sequenceRE = "($h){3}($D){3}($s){2}($E){2}($x)($D)"
if ($line =~ /$sequenceRE/) {
$hPart = $1;
$sPart = $3;
$xPart = $5;
@hValues = ($hPart =~ /($h)/g);
@sValues = ($sPart =~ /($s)/g);
@xValues = ($xPart =~ /($x)/g);
}
Я уверен, что есть кое-что, что я пропустил, и есть некоторые тонкости perl, которые я упустил, но это должно помочь вам в этом. Для получения дополнительной информации прочтите регулярные выражения в Perl * и регулярные выражения .
.