оператор сброса ветки в Perl 5.8.8 - PullRequest
1 голос
/ 13 января 2011

Я хотел знать, как написать регулярное выражение, совместимое с Perl v5.8.8 и Perl v5.10.0, с помощью оператора отдыха ветви?

Я написал код Perl с регулярным выражением в нем, и код прекрасно работает с Perl v5.10.0, но когда я выполняю тот же код с Perl v5.8.8 на другом компьютере, он выдает следующую ошибку;

Sequence (?|...) not recognized in regex; marked by <-- HERE in ...

вот код;

#!/usr/bin/perl -w

my $i = "[1284336000] NEW SERVICE STATE: snpv3;service1;HIGH;SAFE;1;warnings";

if($i =~ /^\[\d+\]\sNEW\sSERVICE\sSTATE:\s(?|(snpv1);(service1)|(snpv1);(service2)|(snpv2);(service2)|(snpv3);(service1)|(snpv3);(service3)|(snpv4);(service4)|(snpv5);(service4)|(snpv6);(service6)|(snpv7);(service7));(HIGH);(\w+);(\d).+$/){
    print "matched\n";
}
else{
    print "not matched\n";
}

Может кто-нибудь подсказать, как сделать регулярное выражение, совместимое с любой из версий.

спасибо

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Оператор сброса ветви (?|...) был добавлен в 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
}
3 голосов
/ 13 января 2011

Оператор сброса ветвления недоступен до Perl 5.10 (согласно man perlre), поэтому, если требуется 5.8, вам придется писать регулярное выражение без него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...