Оператор сброса ветви (?|...)
был добавлен в Perl 5.10.Если вы хотите сделать ваше регулярное выражение обратно совместимым с более ранними версиями Perl, вам нужно изменить его, чтобы удалить конструкцию.
Вот ваш текущий шаблон, написанный с использованием модификатора /x
для удобочитаемости:
my $pattern = qr/
^
\[\d+\]
\s
NEW\sSERVICE\sSTATE:
\s
(?|
(snpv1);(service1)
| (snpv1);(service2)
| (snpv2);(service2)
| (snpv3);(service1)
| (snpv3);(service3)
| (snpv4);(service4)
| (snpv5);(service4)
| (snpv6);(service6)
| (snpv7);(service7)
)
;
(HIGH);
(\w+);
(\d)
.+
$
/x;
Важны ли конкретные комбинации snpv
и service
для совпадения / несовпадения?Если нет, то легко избавиться от конструкции (?|...)
.
my $pattern = qr/
^
\[\d+\]
\s
NEW\sSERVICE\sSTATE:
\s
(snpv\d);
(service\d);
(HIGH);
(\w+);
(\d)
.+
$
/x;
Если комбинации важны, вы все равно можете использовать этот шаблон, но вам нужно будет выполнить дополнительную проверку.
my %valid = (
snpv1 => { service1 => 1, service2 => 1 },
snpv2 => { service2 => 1 },
snpv3 => { service1 => 1, service3 => 1 },
snpv4 => { service4 => 1 },
snpv5 => { service4 => 1 },
snpv6 => { service6 => 1 },
snpv7 => { service7 => 1 },
);
if ($i =~ $pattern && $valid{$1}{$2}) {
# match
}
else {
# no match
}