perl 5.8.8中的分支重置运算符
我想知道如何使用分支rest操作符编写与PerlV5.8.8和PerlV5.10.0兼容的正则表达式 我已经编写了一个包含regexp的perl代码,该代码在PerlV5.10.0中运行良好,但是当我在另一台机器上使用PerlV5.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
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使正则表达式引擎完全可重入,这是您有时需要或想要的。