Perl中已弃用的“ \ C”的替代品是什么?

时间:2018-07-01 13:21:02

标签: regex perl

我想运行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。

1 个答案:

答案 0 :(得分:1)

字符串是一个整数数组,称为字符。

在您的情况下,每个字符/数字似乎是从流中读取的一个字节,并且\xDF \C \C似乎正在尝试将字符/数字/字节与值DF 16 匹配加上其他两个字符/数字/字节。

为此,您只需要

\xDF . .

请注意,您还必须使用/s/s使.匹配任何字符/数字,从而匹配任何字节。 (没有/s.等效于[^\x0A]。)

相关问题