The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Класс символов /\C/ в рег. выражениях устарел. как заменить ?, !*! VladimirV, 13-Фев-17, 17:57  [смотреть все]
имеем ОС Ubuntu 16.04 и perl v5.22.1
проблема
не стартует сервис, завершается с ошибкой
\C is deprecated in regex; marked by <-- HERE in m/\C <-- HERE / at /usr/share/webgui/lib/WebGUI/Asset/Wobject/Poll.pm line 243.

вот строки с 243
243 if ($self->get('a'.$i) =~ /\C/) {
244            $answers .= $self->getValue("a".$i)."\n";
245        }

хотя на perldoc.perl.org пишут
The /\C/ regular expression character class is deprecated. From perl 5.22 onwards it will generate a warning, and from perl 5.24 onwards it will be a regular expression compiler error. If you need to examine the individual bytes that make up a UTF8-encoded character, then use utf8::encode() on the string (or a copy) first.
т.е. должно быть только предупреждение

нашел такой пример
+# XXX FIXME escape_char is buggy as it assigns meaning to the string's storage format.
sub escape_char {
-    return join '', @URI::Escape::escapes{$_[0] =~ /(\C)/g};
+    if (utf8::is_utf8($_[0])) {
+        my $s = $_[0];
+        utf8::encode($s);
+        unshift(@_, $s);
+    }
+
+    return join '', @URI::Escape::escapes{$_[0] =~ /(.)/sg};
}

кто может предложить как заменить регулярное выражение в строке 243

  • Класс символов /\C/ в рег. выражениях устарел. как заменить ?, !*! XAnder, 12:48 , 14-Фев-17 (1)
    > вот строки с 243
    > 243 if ($self->get('a'.$i) =~ /\C/) {
    > 244            $answers .= $self->getValue("a".$i)."\n";
    > 245        }

    Насколько я понимаю, здесь всего лишь проверяется, что get возвращает непустую строку, поскольку /\C/ соответствует любой строке, содержащей хотя бы один байт, то есть любой непустой строке. \C — это низкоуровневая штука, понятно, почему её искореняют.

    Напрашивается замена на «ne ''».

    >[оверквотинг удален]
    >  sub escape_char {
    > -    return join '', @URI::Escape::escapes{$_[0] =~ /(\C)/g};
    > +    if (utf8::is_utf8($_[0])) {
    > +        my $s = $_[0];
    > +        utf8::encode($s);
    > +        unshift(@_, $s);
    > +    }
    > +
    > +    return join '', @URI::Escape::escapes{$_[0] =~ /(.)/sg};
    >  }

    Тут немного не про то, и как-то слишком намудрено по-моему: если строка в UTF-8, её снова кодируют в UTF-8. Хотя, контекста не видно, может тут так оно и надо.

    • Класс символов /\C/ в рег. выражениях устарел. как заменить ?, !*! VladimirV, 17:50 , 14-Фев-17 (2)
      >> вот строки с 243
      >> 243 if ($self->get('a'.$i) =~ /\C/) {
      >> 244            $answers .= $self->getValue("a".$i)."\n";
      >> 245        }
      > Насколько я понимаю, здесь всего лишь проверяется, что get возвращает непустую строку,
      > поскольку /\C/ соответствует любой строке, содержащей хотя бы один байт, то
      > есть любой непустой строке. \C — это низкоуровневая штука, понятно, почему
      > её искореняют.
      > Напрашивается замена на «ne ''».

      \C соответствует одному байту (С char)
      тогда можно заменить на . (точку) или .+
      или наоборот !~ /^$/  (не пустая строка)
      правильно понимаю?

      • Класс символов /\C/ в рег. выражениях устарел. как заменить ?, !*! XAnder, 09:12 , 15-Фев-17 (3)
        > \C соответствует одному байту (С char)
        > тогда можно заменить на . (точку) или .+
        > или наоборот !~ /^$/  (не пустая строка)
        > правильно понимаю?

        Если непременно нужно регулярное выражение, то попробуйте точку. Только помните, что символ перевода строки (\n) точке по умолчанию не соответствует, так что используйте модификатор s. Только вот мне кажется, что проверять строку на «пусто — не пусто» с помощью регулярок — это перебор.

        Попробуйте и так, и эдак. Если заработает — хорошо, нет — ищите другое решение.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру