我想运行Perl 5.24之前的Perl脚本,但出现以下错误:
Could not load class (GMP::Group) because : \C no longer supported in regex; marked by <-- HERE in m/
(?<tag> \xdf \ <-- HERE C \C ) # tlv tag
(?<len> (?| ( \x81 \C ) | ( \x82 \C \C ) | ( \C ) ) ) # tlv length
(?<content> (??{ '\C' x binlen2int($+{len}) }) ) # tlv content
/ at /opt/tsm-v1/bin/../lib/GMP/Group.pm line 42.
该行的合适替代品是什么?
sub tlvre {
qr/
(?<tag> \xdf \C \C )
(?<len> (?| ( \x81 \C ) | ( \x82 \C \C ) | ( \C ) ) )
(?<content> (??{ '\C' x binlen2int($+{len}) }) )
/x;
}
该代码在Perl 5.18上有效,但是
perldiag
状态,\C
是“极端越野车”。
正则表达式不再支持
\ C;以<-HERE标记,以m /%s /
(F)\ C字符类用于允许多字节utf-8字符内的单个字节匹配,但由于v5.24破坏了封装并且其实现极为麻烦,因此在v5.24中已将其删除。如果确实需要处理单个字节,则可能需要使用utf8 :: encode()将字符串转换为一个将每个基础字节存储为字符的字符串。
现在我正在使用Perl 5.28。
答案 0 :(得分:1)
字符串是一个整数数组,称为字符。
在您的情况下,每个字符/数字似乎是从流中读取的一个字节,并且\xDF \C \C
似乎正在尝试将字符/数字/字节与值DF 16 匹配加上其他两个字符/数字/字节。
为此,您只需要
\xDF . .
请注意,您还必须使用/s
。 /s
使.
匹配任何字符/数字,从而匹配任何字节。 (没有/s
,.
等效于[^\x0A]
。)