The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  вход/выход  слежка  RSS
"Класс символов /\C/ в рег. выражениях устарел. как заменить ?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Класс символов /\C/ в рег. выражениях устарел. как заменить ?"  +/
Сообщение от VladimirV (ok) on 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ообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Класс символов /\C/ в рег. выражениях устарел. как заменить ?"  +/
Сообщение от XAnder (ok) on 14-Фев-17, 12:48 
> вот строки с 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. Хотя, контекста не видно, может тут так оно и надо.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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