Модератор: Модераторы разделов
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 11:11
Есть вот такой код:
Код: Выделить всё
while($tmp =~ /\n\s*#if\s*([^\$]*?)\s*\n/)
{ if(eval $1 == 1)
{ $tmp =~ s/\r?\n\s*#if\s*$1\s*\r?\n((.*\r?\n\s*)+?)#else(.*\r?\n\s*)+?\#endif/\n\1/g;
$tmp =~ s/\r?\n\s*#if\s*$1\s*\r?\n((.*\r?\n\s*)+?)#endif/\n\1/g;
}
else
{ $tmp =~ s/\r?\n\s*#if\s*$1\r?\n(.*\r?\n\s*)+?#else((.*\r?\n\s*)+?)#endif/\n\2/g;
$tmp =~ s/\r?\n\s*#if\s*$1\s*\r?\n((.*\r?\n\s*)+?)#endif//g;
}
}
print $tmp;
С вот таким текстом всё работает (на месте $i перед этим подставляется либо 1, либо 2):
Если же текст вот такой (вместо переменных на момент прохода цикла опять же стоят цифры):
происходит зацикливание. Я уже не знаю, чего и думать.. Может, подскажете чего?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2
Сообщение
Shura » 18.12.2005 12:52
может быть $j>1 выполняется раньше, чем прибавляется $i. Попробуй скобки поставить. Т.е. if ($i+$j)>1
Rock'n'roll мертв © БГ
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9
Сообщение
Sparky » 18.12.2005 13:26
А что мешает в каждом проходе выводить переменные $i и $j и смотреть как они меняюся?
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze
Сообщение
neuralNetwork » 18.12.2005 17:28
Это из-за того, что если $1 равно, к примеру, 1+1>1, при его подстановке в любое из регулярных выражений внутренних блоков знак + воспринимается как метасимвол, а не как нормальный символ.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 18:45
(Neuron @ Dec 18 2005, в 17:28) писал(а): Это из-за того, что если $1 равно, к примеру, 1+1>1, при его подстановке в любое из регулярных выражений внутренних блоков знак + воспринимается как метасимвол, а не как нормальный символ.
Спасибо, похоже. А как это побороть?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9
Сообщение
Sparky » 18.12.2005 19:13
Экранировать?
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 19:14
(Sparky @ Dec 18 2005, в 13:26) писал(а): А что мешает в каждом проходе выводить переменные $i и $j и смотреть как они меняюся?
Да выводил я и смотрел. То-то меня и удивило, что выражение внутри while нормально обработалось, а подстановка $1 из него же на том же самом тексте не срабатывает. Ответ
neuralNetwork объясняет, почему так происходит.
(Sparky @ Dec 18 2005, в 19:13) писал(а): Экранировать?
Как?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9
Сообщение
Sparky » 18.12.2005 19:58
t.t писал(а): ↑ 18.12.2005 19:14
Как?
бэкслешем не получается?
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 20:07
(Sparky @ Dec 18 2005, в 19:58) писал(а): бэкслешем не получается?
Здрасте, бэкслешем.. Где? Было бы оно в явном виде там, где этот плюс мешает, думаешь я задавал бы такие вопросы?
Пока решил переносом на другую сторону, т.е. $i==1-$j вместо $i+$j==1. Работает.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9
Сообщение
Sparky » 18.12.2005 20:11
Ну признаться я просто предположил
Вообще мне PERL не очень нравится из-за таких вот "write only" конструкций, сорри за оффтоп, опять же blink.gif
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 20:31
(Sparky @ Dec 18 2005, в 20:11) писал(а): Вообще мне PERL не очень нравится из-за таких вот "write only" конструкций
Ну, что поделаешь?.. Такие задачи я даже не знаю на чём ещё можно так просто решить, кроме перла.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze
Сообщение
neuralNetwork » 18.12.2005 22:24
Можно заэкранировать следующим образом:
и далее использовать $new вместо $1.
Sparky писал(а): ↑ 18.12.2005 20:11
Вообще мне PERL не очень нравится из-за таких вот "write only" конструкций, сорри за оффтоп, опять же blink.gif
А мне всегда казалось, что это придает Perl'у совершенно особенный шарм.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 18.12.2005 23:03
(Neuron @ Dec 18 2005, в 22:24) писал(а): Можно заэкранировать следующим образом:
Это я уже догадался. Когда спрашивал, голова уже была квадратная.
(Neuron @ Dec 18 2005, в 22:24) писал(а): А мне всегда казалось, что это придает Perl'у совершенно особенный шарм.
Это зависит от того, насколько хорошо его знать
Я вот пока знаю его плохо, т.к. кроме вот этих двух скриптов-обёрток над нашим внутренним языком ничего писать не приходилось.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж