Ужасы неявного изменяемого состояния! Мва-ха-ха!
(Извините.) * vti <[email protected]> [2012-10-27 23:48:16+0300] > Это особенность оператора each. Почитай документацию. Там внутри есть > свой счетчик. > > On 10/27/2012 11:27 PM, Cyrill Novgorodcev wrote: > > Здравствуйте. > > > > Написал небольшое тестовое приложение,что бы объяснить свою проблему. > > > > основной модуль приложения lib/SmallTest.pm > > > > package SmallTest; > > use Mojo::Base 'Mojolicious'; > > > > sub startup { > > my $self = shift; > > > > $self->plugin( 'Config' ); > > > > my $r = $self->routes; > > $r->get('/')->to('example#welcome'); > > } > > > > 1; > > > > и контроллер lib/SmallTest/Example.pm > > > > package SmallTest::Example; > > use Mojo::Base 'Mojolicious::Controller'; > > #use Data::Dumper; > > > > sub welcome { > > my $self = shift; > > my $test = 0; > > # $self->app->log->debug( Dumper( $self->config->{ test } ) ); > > while ( my ( $key, $val ) = each %{ $self->config->{ test } } ) { > > if ( $test =~ $key ) { > > $test = $val; > > last; > > } > > } > > $self->render( message => $test ); > > } > > > > 1; > > > > файл конфига small_test.conf: > > > > { > > test => { > > 0 => 'x00', > > 1 => 'x11', > > 2 => 'x22', > > }, > > } > > > > шаблон вывода templates/example/welcome.html.epl > > > > % layout 'default'; > > <h2><%= $message %></h2> > > > > Теперь достаточно запустить и просто обновлять (рефрешить) окно, что > > бы увидеть, что данные из конфига считываются с позиции предыдущего > > обхода. То есть, если в предыдущий раз было найдено вхождение и был > > осуществлен принудительный выход из цикла, то в след. раз обход > > продолжится с следующего (относительно первого обхода) значения, те > > значения, которые были использованы в первом поиске - в текущем уже > > учитываться не будут. Т.к. с следующей позиции вхождение не удастся > > найти, то поиск завершится неудачей и только при третьем обновлении, > > то есть в следующий раз снова будет начат с первой позиции. > > > > В качестве костыля достаточно выводить дамп в лог (раскомментировать > > строки) и все чудесным образом начинает работать так, как и > > задумывалось. Если запускать приложение в cgi-окружении, то проблема > > не возникает. Но, даже банальный тест (см ниже) не проходит, т.к. > > используется внутренний сервер. > > > > тест-файл t/01-def.t > > > > use strict; > > use warnings; > > > > use Test::More 'no_plan'; > > use Test::Mojo; > > > > my $t = Test::Mojo->new( 'SmallTest' ); > > $t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' ); > > $t->get_ok('/')->status_is(200)->text_is( 'h2' => 'x00' ); > > > > Теперь, собственно, вопрос: это нормальное поведение? > > > > PS: Тестовое приложение можно взять на гитхабе > > git clone https://github.com/cynovg/SmallTest > > > > _______________________________________________ > Kiev-pm mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/kiev-pm _______________________________________________ Kiev-pm mailing list [email protected] http://mail.pm.org/mailman/listinfo/kiev-pm
