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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает регэксп в пользовательской функции, Не работает регэксп в пользовательской ф 
:(
    Опции темы
migaro
Дата 7.9.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем такая ситуация.. Пишу скрипт для добавления юзеров на сайт.. Скрипт читает инфу из файлика.. Файлик вот такого вот формата:

Код

102:Абросімова:Ганна:Анатоліївна:12/30/1987:[email protected]:2:35:22:спеціаліст з продаж по телефону:(044) 444-44-44:(067) 777-77-77
628:Гачковський:Володимир:Володимирович:03/20/1986:[email protected]:2:17:31:Системний адмiнiстратор:(044) 444-44-44:(063) 447-37-26


Мыло тут в примере я сменил, шобы не спамили всякие.. )

Код пишу с такими юзами:

Код

 use 5.010;
 use DBI;
 use Getopt::Long;
 use strict;
 use warnings;
 use utf8;


И в коде есть такая строка:

Код

($user{uid},$user{lname},$user{fname},$user{mname},$user{bday},$user{mail},$user{city},$user{str_part},$user{dep},$user{post},$user{phone},$user{mphone}) = split(/:/, $_);


Которая считывает данные из файлика, бъет его по ":" и разбрасывает красивенько по переменным.. потом все это дело я решил проверить, а не корявый ли файлик мне попался.. ^____^ И создал, я, функу check_data и передал ей такое вот счастье:

Код

check_data \%user;


Сама функа должна просто проверить данные.. и если что-то не так - завалить програмку... :

Код

sub check_data {
  my %user = %{shift()}; # Забираем хэш

 # Отладочный вывод
  print "$_ => $user{$_}\n" for (keys %user);

# Проверяем все что приняли по очереди:
  $user{uid} =~ /\d+/ or die "Wrong data! Check data file: uid\n";
  $user{lname} =~ /\w+/ or die "Wrong data! Check data file: lname\n";
  $user{fname} =~ /\w+/ or die "Wrong data! Check data file: fname\n";
  $user{mname} =~ /\w+/ or die "Wrong data! Check data file: mname\n";
  $user{bday} =~ m!\d{2}/\d{2}/\d{4}! or die "Wrong data! Check data file: bday\n";
  $user{mail} =~ /\w\.\w+@\w+\.\w+/ or die "Wrong data! Check data file: mail\n";
  $user{city} =~ /\w+/ or die "Wrong data! Check data file: city\n";
  $user{str_part} =~ /\w+/ or die "Wrong data! Check data file: str_part\n";
  $user{dep} =~ /\w+/ or die "Wrong data! Check data file: dep\n";
  $user{post} =~ /\w+/ or die "Wrong data! Check data file: post\n";
  $user{phone} =~ /\(\d{3}\)\s\d{3}-\d{2}-\d{2}/ or die "Wrong data! Check data file: phone\n";
  $user{mphone} =~ /\(\d{3}\)\s\d{3}-\d{2}-\d{2}/ or die "Wrong data! Check data file: mphone\n";
}


Вроде все красиво.. Но!.. почему то не срабатывает регэксп при проверке lname... Я даже создавал такую муть что бы это проверить:

Код

#!/usr/bin/perl
use strict;
use 5.010;
use warnings;
use utf8;

my $str = 'Абросімова';

$str =~ /\w+/ or die "Oops!\n";


Но тут все хорошо!.. Где же собака порылась?.. ))) За ранее благодарен..
PM MAIL   Вверх
DurRandir
Дата 7.9.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скорее всего - вы читаете данные из файла как байты, а не как юникодовые символы. Поэтому для строковых констант всё и работает.
PM   Вверх
migaro
Дата 7.9.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Файл я подключил так:

Код

open USERS, "<./users" or die "Cannot open data file: $!";


Тело программы вертиться в while с дескриптором USERS в условии.. Все это дело писалось на mint linux.. Родная кодировка там utf8.. Значит и файл users написаный под utf8...

Я учился по "лама-буку".. в "лама-буке" написано что конструкцию вида <USERS> можно назвать оператором построчного ввода. Разъясните, может оно и читает побайтово?..

Это сообщение отредактировал(а) migaro - 7.9.2012, 13:35
PM MAIL   Вверх
alezzz
Дата 7.9.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



попробуте для выяснения проблемы:
Код

use Encode;

Encode::_utf8_on($user{lname});

PM MAIL   Вверх
migaro
Дата 7.9.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решилось!.. изменил открытие файла:

Код

open USERS, "<:encoding(UTF-8)", "./users" or die "Cannot open data file: $!";


Знакомый подсказал доку.. http://perldoc.perl.org/perluniintro.html#Unicode-I/O ;)
PM MAIL   Вверх
Pfailed
Дата 7.9.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Или чуть короче
Код

open USERS, "<:utf8", "./users" or die "Cannot open data file: $!"



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


 




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


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

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