Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чайниковский вопрос про перл и регекспы 
:(
    Опции темы
tihohod
Дата 18.6.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.6.2007

Репутация: нет
Всего: нет



Мне, волею судеб, пришлось столкнуться со скриптом на Perl.
К сожалению, я им не владею :(
Проблема в том, что при его исполнении жестко падает приложение (линукс-демон), вызывающий Перл-интерпретатор.
Вот кусочек проблематичного кода:

sub is_name_valid ($) {
    my $name = shift;

    utf8::decode($name);

    return unless ( defined($name) );
    return unless ( length($name) );

    return $name =~ /^[-_.@ [:alnum:]]+$/;
}

Этот скрипт вызвается в качестве callback-а для функции validate_with.
Perl 5.8

Подскажите пожалуйста - в чем может быть проблема?
PM MAIL   Вверх
shamber
Дата 18.6.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



А падает с какими ругательствами?
PM MAIL Jabber   Вверх
Nab
Дата 18.6.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Вот в этой строке 
 return $name =~ /^[-_.@ [:alnum:]]+$/;
мне неизвестна конструкция [:alnum:], подозреваю она должна идентифицировать любое число...
но тогда здесь должна быть предварительная обработка функции...
или можете ее попробовать заменить на такое

 return $name =~ /^[-_.@0-9]+$/;

Хотя по идее обычно имя состоит из букв а не цифр, судя по имени функции...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
errr
Дата 18.6.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.6.2007

Репутация: нет
Всего: нет



:alnum: - это любой буквенно-цифровой символ.

я тут попробовал у себя конструкцию с :alnum: , у меня ничего не тормозит, (не тормознее return $name =~/^(?:\w|[-_.@])+$/) наверно дело не в этом.

попробуйте запустить с  smallprof (http://search.cpan.org/~salva/Devel-SmallProf-2.02/lib/Devel/SmallProf.pm)
PM MAIL   Вверх
nitr
Дата 18.6.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



из доков:
Цитата

\w This is an abbreviation for [[:alnum:]_]
...


ALNUM       Match any alphanumeric character
...


The POSIX character class syntax
    [:class:]
is also available. The available classes and their backslash equivalents (if available) are as follows:
    alpha
    alnum
    ascii
    blank               [1]
    cntrl
    digit       \d
    graph
    lower
    print
    punct
    space       \s      [2]
    upper
    word        \w      [3]
    xdigit



так что очень похоже что вам надо (в двух словах) после вашего #!/usr/bin/perl указать (вставить) use POSIX;

;)


--------------------
PM   Вверх
Nab
Дата 19.6.2007, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Мдееее, надо восполнять пробелы в знаниях smile

Добавлено через 4 минуты и 30 секунд
А также я бы обратил внимание на пробел в классе символов, между @ и этим самым [:alnum:],  возможно именно он и является недопустимым символом для имени...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 19.6.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(nitr @  18.6.2007,  23:10 Найти цитируемый пост)
так что очень похоже что вам надо (в двух словах) после вашего #!/usr/bin/perl указать (вставить) use POSIX;
Не... Часто пользуюсь посиксовыми классами символов, они работают и без use POSIX;
А регулярное выражение можно сократить, т.к. [_[:alnum:]] в точности эквивалентно [\w]. Получится
Код

return $name =~ /^[-.@ \w]+$/;

Не вижу в этой подпрограмме ничего такого, что могло бы приводить к краху. Единственное, в описании прагмы utf8 настоятельно НЕ рекомендуют использовать ее ни для каких-либо целей, кроме как сказать перлу, что скрипт написан в UTF8. А в подпрограмме utf8 используется для декодировки. Для этого просят использовать прагму encoding.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.