Forum Webscript.Ru
Программирование => Perl => Тема начата: 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". То есть не тот порядок, который хотелось бы увидеть. Где грабли?
-
что хотелось бы увидеть?
-
TEXTBEGIN01.02.03N04:05:06.<01> testTEXTEND - получается
01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND - нужно.
Почему при /e и разном коде замены в результате работы выражения куски текста меняются местами? Долго переписывал, пробовал разные варианты. Заметил, ещё единица откуда-то в "BEGIN1TEXT".
-
ИХМО... регеплексы медленные... и использовать я бы их порекомендовал в крайнем случае... :
как вариант. (посмотри внимательно 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";
-
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 - нужно
Ты все-таки определись, что тебе нужно... ;)
-
Если я правильно понял... то можно так:
#!/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";
-
Mike, точно, я перепутал. Слова "нужно" и "получается" нужно переставить местами. Получается. ;)
commander, интересный вариант, я подумаю. Хотя сложность и медленность регов не пугает.
Есть огромный файл. Нужно в нем найти кусочек, совпадающий с числами из @dig и ко всем совпадениям дописать число, увеличивающиеся на единицу.
Мне как-то проще и интереснее отдать его на растерзание регэкспам, чем писать много всяких циклов.
Нужные числа (@dig) тоже находится регэкспом. Тогда должен бы срабатывать этот. Но он почему-то не хочет.
-
GrAfF
Есть огромный файл.
тем более не рекомендую регэксы...
-
commander, больше в том смысле, что мусора там много. Работает всё равно быстро. Мне проще и интереснее через рег... Единственная проблема - не пойму как написать правильно этот кусок кода.
-
Если файл строкоориентирован и в строке искомое встречается только раз то:
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
иначе нужно код не много усложнить.
-
Спасибо за советы. Возможно, напишу в таком духе, без рег. Но основной вопрос остался чуть нераскрытым - как правильно написать код замены в регэкспе, чтобы результат был более похож на нужный?
-
Заработало вот так:
$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;
}
Почему?