Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Alan Long                            2:5030/1082.72 24 Nov 2000  12:37:30
 To : Eugene V. Sofronov
 Subject : Помогите с REGEXP'ом...
 -------------------------------------------------------------------------------- 
 
 * Originally from Eugene V. Sofronov (2:5020/400) to All.
 
  EVS> From: "Eugene V. Sofronov" <ace@lglobus.ru>
 
  EVS> %SUBJ%, пожалуйста! REGEXP нужен для следующей цели - есть файл
  EVS> формата:
  EVS> === BEGIN ===
  EVS> TITLE#1:
  EVS> ORIGINAL#1 - NAME#1 (SHORTNAME#1) /DESCRIPTION#1/
  EVS> ....
 
  EVS> TITLE#2:
  EVS> ORIGINAL#2 - NAME#2 (SHORTNAME#2) /DESCRIPTION#2/
  EVS> ....
  EVS> === END ===
  EVS> Для ясности -  это список вещей, разделенных на классы (Swords, 
  EVS> Daggers, etc.) Каждая запись - отдельная строка в файле, т.е. с 
  EVS> \r\n в конце. В поле 'TITLE' находится название класса, 
  EVS> 'ORIGINAL' - оригинальное название, 'NAME' - английское название, 
  EVS> 'SHORTNAME' - сокращенное английское название, 'DESCRIPTION' - 
  EVS> описание или параметры. Все скобки и разделители соблюдаются
  EVS> как в примере. Hадо все это хозяйство разложить на переменные. 
  EVS> Я ищу поле 'TITLE' так:
  EVS> === BEGIN ===
  EVS> next if ($_ eq '');
  EVS> $str_len = length($_);
  EVS> $last = substr($_, $str_len-1, $str_len-2);
  EVS> $title = substr($_, 0, $str_len-1);
  EVS> === END ===
  EVS> Если ($last eq ':'), то у нас 'TITLE' = $title. Первая строка
  EVS> отсекает пустые записи в файле. Хотелось бы покрасивше, только в 
  EVS> голову не лезет ничего. А вот с остальным проблема: поле 
  EVS> 'ORIGINAL' может не подчиняться правилу \w+, ибо может являться 
  EVS> любым другим языком, отличным от английского и русского.
  EVS> А поле 'SHORTNAME' может вообще отсутствовать, в этом случае
  EVS> надо присвоить ему значение 'NAME', записанное в верхнем 
  EVS> регистре. Я попробовал решить в лоб:
  EVS> /^(.*)\s-\s(.*)\s\((.*)\)\s\/(.*)\//;
  EVS> $name = $1; $eng_name = $2; $eng_short = $3; $attr = $4;
  EVS> но скрипт стал загружаться бесконечно. Дальнейшие попытки
  EVS> расчленить этот REGEXP привели к неутешительным результатам. Как 
  EVS> правильно записать REGEXP?
 
 while( <> ) {
    chomp;   # ???
    if( /(.+):\s*$/ ) {
       $title = $1;
    } else if( /^(.*)\s+-\s+(\S+)\s+\(([^)]+)\)\s+\/(.+)\/$\)/ ) {
       ($name, $eng_name, $eng_short, $attr ) = ( $1, $2, $3, $4 );
    }
 }
 
 Вроде-бы так, единственное, я не проверял этот пример на реальном perl-е... Hо
 смысл примерно такой.
 
  EVS> Eugene V. Sofronov /      E-Mail: ace@lglobus.ru       / ICQ UIN
 
 --
 With best,
      Ъ-·    Ъ
      Е-ЧLaі\і <alan@x-rays.eu.org>
 
 --- timEd/386 1.10+
  * Origin: X - Rays Station (2:5030/1082.72)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Помогите с REGEXP\'ом...   Eugene V. Sofronov   24 Nov 2000 01:53:02 
 Помогите с REGEXP\'ом...   Alan Long   24 Nov 2000 12:37:30 
Архивное /ru.cgi.perl/4581a1e2b4a0.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional