Forum Webscript.Ru

Программирование => Perl => Тема начата: GrAfF от 02 Августа 2004, 17:28:19

Название: Немного глючит регулярное
Отправлено: GrAfF от 02 Августа 2004, 17:28:19
Доброе!
$strout = \'TEXTBEGIN01.02.03\\N04:05:06TEXTEND\';

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';
$i = \'1\';

$strout =~ s/$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5]/print"$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5].";printf \'<%02s>\', $i++;print "   test";/ge;

Почему-то получается "01.02.03\\N04:05:06.<01>   testTEXTBEGIN1TEXTEND". То есть не тот порядок, который хотелось бы увидеть. Где грабли?
Название: Немного глючит регулярное
Отправлено: commander от 02 Августа 2004, 17:46:10
что хотелось бы увидеть?
Название: Немного глючит регулярное
Отправлено: GrAfF от 02 Августа 2004, 17:59:38
TEXTBEGIN01.02.03N04:05:06.<01> testTEXTEND - получается
01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND - нужно.
Почему при /e и разном коде замены в результате работы выражения куски текста меняются местами? Долго переписывал, пробовал разные варианты. Заметил, ещё единица откуда-то в "BEGIN1TEXT".
Название: Немного глючит регулярное
Отправлено: commander от 02 Августа 2004, 18:05:13
ИХМО... регеплексы медленные... и использовать я бы их порекомендовал в крайнем случае... :
как вариант. (посмотри внимательно datetime отделены чем либо от текста? например пробелами...):
$strout = \'TEXTBEGIN 01.02.03N04:05:06 TEXTEND\';

($text_begin, $time, $text_end)=split(" ", $strout);
($time, $date) = split("N", $time);

print "time: $time\\n date: $date\\n text_begin: $text_begin\\n text_end: $text_end\\n";
Название: Немного глючит регулярное
Отправлено: mike от 02 Августа 2004, 18:06:24
Цитировать
GrAfF:
Почему-то получается "01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND". То есть не тот порядок, который хотелось бы увидеть. Где грабли?

Цитировать
GrAfF:
TEXTBEGIN01.02.03N04:05:06.<01> testTEXTEND - получается
01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND - нужно


Ты все-таки определись, что тебе нужно... ;)
Название: Немного глючит регулярное
Отправлено: commander от 02 Августа 2004, 18:12:56
Если я правильно понял... то можно так:
#!/usr/bin/perl -w

$strout = \'TEXTBEGIN01.02.03N04:05:06TEXTEND\';

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';

$datetime="$dig[0].$dig[1].$dig[2]N$dig[3]:$dig[4]:$dig[5]";
($text_begin, $text_end)=split($datetime, $strout);

print "datetime: $datetime\\n text_begin:$text_begin \\n text_end: $text_end";
Название: Немного глючит регулярное
Отправлено: GrAfF от 02 Августа 2004, 18:26:40
Mike, точно, я перепутал. Слова "нужно" и "получается" нужно переставить местами. Получается. ;)

commander, интересный вариант, я подумаю. Хотя сложность и медленность регов не пугает.
Есть огромный файл. Нужно в нем найти кусочек, совпадающий с числами из @dig и ко всем совпадениям дописать число, увеличивающиеся на единицу.
Мне как-то проще и интереснее отдать его на растерзание регэкспам, чем писать много всяких циклов.
Нужные числа (@dig) тоже находится регэкспом. Тогда должен бы срабатывать этот. Но он почему-то не хочет.
Название: Немного глючит регулярное
Отправлено: commander от 02 Августа 2004, 18:33:29
GrAfF
Цитировать
Есть огромный файл.

тем более не рекомендую регэксы...
Название: Немного глючит регулярное
Отправлено: GrAfF от 02 Августа 2004, 18:53:02
commander, больше в том смысле, что мусора там много. Работает всё равно быстро. Мне проще и интереснее через рег... Единственная проблема - не пойму как написать правильно этот кусок кода.
Название: Немного глючит регулярное
Отправлено: vladsu от 02 Августа 2004, 19:15:03
Если файл строкоориентирован и в строке искомое встречается только раз то:

my @dig;

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';
my $i = \'1\';

my $str = join( ".", @dig[0..2] ) . \'N\' . join( ":", @dig[3..5] );

while ( ) {
        substr( $_, index( $_, $str ), length($str) ) = $str.\'.<\'.$i++.\'>\';
        print;
}

__DATA__
TEXTBEGIN01.02.03N04:05:06TEXTEND
TEXTBEGIN01.02.03N04:05:06TEXTEND

иначе нужно код не много усложнить.
Название: Немного глючит регулярное
Отправлено: GrAfF от 04 Августа 2004, 21:01:21
Спасибо за советы. Возможно, напишу в таком духе, без рег. Но основной вопрос остался чуть нераскрытым - как правильно написать код замены в регэкспе, чтобы результат был более похож на нужный?
Название: Немного глючит регулярное
Отправлено: GrAfF от 04 Августа 2004, 21:45:27
Заработало вот так:
$strout =~ s/$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5]/"$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5].".ttt().$comment/ge;

sub ttt{
my $aa = sprintf (\'%02s\', $i++);
return $aa;
}

Почему?