Что является заменой устаревшего "\ C" в Perl? - PullRequest
0 голосов
/ 01 июля 2018

Я хочу запустить скрипт Perl, написанный до Perl 5.24, и получаю следующую ошибку:

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 больше не поддерживается в регулярных выражениях; отмечено <- ЗДЕСЬ в м /% с / </strong>

    (F) Класс символов \ C, используемый для разрешения совпадения одного байта в многобайтовом символе utf-8, но был удален в v5.24, поскольку он нарушал инкапсуляцию и его реализация была чрезвычайно ошибочной. Если вам действительно нужно обработать отдельные байты, вы, вероятно, захотите преобразовать вашу строку в строку, в которой каждый нижележащий байт хранится как символ, с помощью utf8 :: encode ().

Сейчас я использую Perl 5.28.

1 Ответ

0 голосов
/ 02 июля 2018

Строка - это массив целых чисел, называемых символами.

В вашем случае каждый символ / число отображается в байте, считанном из потока, и \xDF \C \C, кажется, пытается сопоставить символ / число / байт со значением DF 16 , за которым следуют любые два другие символы / цифры / байты.

Для этого вы просто хотите

\xDF . .

Обратите внимание, что вы также должны использовать /s. /s заставляет . соответствовать любому символу / номеру и, следовательно, любому байту. (Без /s, . эквивалентно [^\x0A].)

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