Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl 5.8.8中的分支重置运算符_Perl_Version - Fatal编程技术网

perl 5.8.8中的分支重置运算符

perl 5.8.8中的分支重置运算符,perl,version,Perl,Version,我想知道如何使用分支rest操作符编写与PerlV5.8.8和PerlV5.10.0兼容的正则表达式 我已经编写了一个包含regexp的perl代码,该代码在PerlV5.10.0中运行良好,但是当我在另一台机器上使用PerlV5.8.8执行相同的代码时,会出现以下错误: Sequence (?|...) not recognized in regex; marked by <-- HERE in ... 有人能建议如何制作一个与任何一个版本兼容的regexp吗 谢谢,根据man per

我想知道如何使用分支rest操作符编写与PerlV5.8.8和PerlV5.10.0兼容的正则表达式

我已经编写了一个包含regexp的perl代码,该代码在PerlV5.10.0中运行良好,但是当我在另一台机器上使用PerlV5.8.8执行相同的代码时,会出现以下错误:

Sequence (?|...) not recognized in regex; marked by <-- HERE in ...
有人能建议如何制作一个与任何一个版本兼容的regexp吗


谢谢,根据man perlre,分支重置操作符在Perl 5.10之前不可用,因此如果5.8是一个要求,那么您必须在没有它的情况下编写正则表达式。

根据man perlre,分支重置操作符在Perl 5.10之前不可用,因此如果5.8是一个要求,那么您必须在没有它的情况下编写正则表达式。

。。。在Perl 5.10中添加了分支重置操作符。如果希望使正则表达式向后兼容早期版本的Perl,则需要对其进行修改以删除该结构

my $pattern = qr/
    ^
    \[\d+\]
    \s
    NEW\sSERVICE\sSTATE:
    \s
    (snpv\d);
    (service\d);
    (HIGH);
    (\w+);
    (\d)
    .+
    $
/x;
以下是您当前的图案,使用/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和服务的具体组合对匹配/非匹配是否重要?如果不是,很容易摆脱?|。。。构造

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
}
那是什么。。。在Perl 5.10中添加了分支重置操作符。如果希望使正则表达式向后兼容早期版本的Perl,则需要对其进行修改以删除该结构

my $pattern = qr/
    ^
    \[\d+\]
    \s
    NEW\sSERVICE\sSTATE:
    \s
    (snpv\d);
    (service\d);
    (HIGH);
    (\w+);
    (\d)
    .+
    $
/x;
以下是您当前的图案,使用/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和服务的具体组合对匹配/非匹配是否重要?如果不是,很容易摆脱?|。。。构造

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
}

哦不,请不要告诉我。我有不同的机器,有些有V5.8.8,有些有5.10.0。如果我必须更改代码,那么所有内容都需要修改。将所有系统升级到v5.10.0可能是一个不错的选择,但此版本是否具有向后兼容性?我的意思是用v5.8.8编写的其他perl代码是否可以用v5.10.0运行?是否有任何兼容性背景?如果可以将所有内容升级到5.10,我建议这样做。Perl的向后兼容性非常好,所以除非您正在做一些非常奇怪的事情,否则它应该可以正常工作。请记住,许多模块(如DBI和DBD:::*驱动程序)都依赖于本机代码,因此在升级perl后,您还必须重新安装这些模块。perl5移植程序非常长,以确保perl向后兼容。不过,您最终有责任确保它在您的代码上工作。我个人已将5.10作为最早的基线版本,我将把基于正则表达式的Perl程序移植到该版本。否则,您将无法访问太多。首次出现在5.10中的众多regex功能增强非常重要,而且很多,您确实无法使用将代码向后移植到5.8或更早版本所需的其他方法合理方便地模拟它们。命名和相对捕获组、posessive组、定义块、组递归、更好的Unicode道具、改进的\X以及更多。5.12使正则表达式引擎完全可重入,这是您有时需要或想要的!不,请不要告诉我。我有不同的机器,有些有V5.8.8,有些有5.10.0。如果我必须更改代码,那么所有内容都需要修改。将所有系统升级到v5.10.0可能是一个不错的选择,但此版本是否具有向后兼容性?我的意思是用v5.8.8编写的其他perl代码是否可以用v5.10.0运行?是否有任何兼容性背景?如果可以将所有内容升级到5.10,我建议这样做。Perl的向后兼容性非常好,所以除非您正在做一些非常奇怪的事情,否则它应该可以正常工作。请记住,许多模块(如DBI和DBD:::*驱动程序)都依赖于本机代码,因此在升级perl后,您还必须重新安装这些模块。perl5移植程序非常长,以确保perl向后兼容。不过,您最终有责任确保它在您的代码上工作。我个人已将5.10作为最早的基线版本,我将把基于正则表达式的Perl程序移植到该版本。否则,您将无法访问太多。首次出现在5.10中的众多regex功能增强非常重要,而且很多,您确实无法使用将代码向后移植到5.8或更早版本所需的其他方法合理方便地模拟它们。命名和相对捕获组、posessive组、定义块、组递归、更好的Unicode道具、改进的\X以及更多。5.12使正则表达式引擎完全可重入,这是您有时需要或想要的。