Перл: странное зацикливание (нич-чего непонимаю..)

Модератор: Модераторы разделов

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Перл: странное зацикливание

Сообщение t.t »

Есть вот такой код:

Код: Выделить всё

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):

Код: Выделить всё

#if $i>1
    ...
#endif

Если же текст вот такой (вместо переменных на момент прохода цикла опять же стоят цифры):

Код: Выделить всё

#if $i+$j>1
    ...
#endif
происходит зацикливание. Я уже не знаю, чего и думать.. Может, подскажете чего?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Перл: странное зацикливание

Сообщение Shura »

может быть $j>1 выполняется раньше, чем прибавляется $i. Попробуй скобки поставить. Т.е. if ($i+$j)>1
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Перл: странное зацикливание

Сообщение Sparky »

А что мешает в каждом проходе выводить переменные $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

Re: Перл: странное зацикливание

Сообщение neuralNetwork »

Это из-за того, что если $1 равно, к примеру, 1+1>1, при его подстановке в любое из регулярных выражений внутренних блоков знак + воспринимается как метасимвол, а не как нормальный символ.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Перл: странное зацикливание

Сообщение t.t »

(Neuron @ Dec 18 2005, в 17:28) писал(а):Это из-за того, что если $1 равно, к примеру, 1+1>1, при его подстановке в любое из регулярных выражений внутренних блоков знак + воспринимается как метасимвол, а не как нормальный символ.
Спасибо, похоже. А как это побороть?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Перл: странное зацикливание

Сообщение Sparky »

Экранировать?
Блог
--------------------

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

Re: Перл: странное зацикливание

Сообщение t.t »

(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

Re: Перл: странное зацикливание

Сообщение Sparky »

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

Re: Перл: странное зацикливание

Сообщение t.t »

(Sparky @ Dec 18 2005, в 19:58) писал(а):бэкслешем не получается?
Здрасте, бэкслешем.. Где? Было бы оно в явном виде там, где этот плюс мешает, думаешь я задавал бы такие вопросы?

Пока решил переносом на другую сторону, т.е. $i==1-$j вместо $i+$j==1. Работает.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Перл: странное зацикливание

Сообщение Sparky »

Ну признаться я просто предположил :) Вообще мне 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

Re: Перл: странное зацикливание

Сообщение t.t »

(Sparky @ Dec 18 2005, в 20:11) писал(а):Вообще мне PERL не очень нравится из-за таких вот "write only" конструкций
Ну, что поделаешь?.. Такие задачи я даже не знаю на чём ещё можно так просто решить, кроме перла.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze

Re: Перл: странное зацикливание

Сообщение neuralNetwork »

Можно заэкранировать следующим образом:

Код: Выделить всё

$new = $1;
$new =~ s/\+/\\\+/g;
и далее использовать $new вместо $1.

Sparky писал(а):
18.12.2005 20:11
Вообще мне PERL не очень нравится из-за таких вот "write only" конструкций, сорри за оффтоп, опять же blink.gif
А мне всегда казалось, что это придает Perl'у совершенно особенный шарм. ;)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Перл: странное зацикливание

Сообщение t.t »

(Neuron @ Dec 18 2005, в 22:24) писал(а):Можно заэкранировать следующим образом:
Это я уже догадался. Когда спрашивал, голова уже была квадратная.

(Neuron @ Dec 18 2005, в 22:24) писал(а):А мне всегда казалось, что это придает Perl'у совершенно особенный шарм.
Это зависит от того, насколько хорошо его знать ;) Я вот пока знаю его плохо, т.к. кроме вот этих двух скриптов-обёрток над нашим внутренним языком ничего писать не приходилось.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: