|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/4581a1e2b4a0.html, оценка из 5, голосов 10
|