[Kiev-pm] Данные из конфига считываются с позиции предыдущего обхода (mojolicious)

Roman Cheplyaka roma at ro-che.info
Sat Oct 27 14:35:48 PDT 2012


Ужасы неявного изменяемого состояния! Мва-ха-ха!

(Извините.)

* vti <viacheslav.t at gmail.com> [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
> Kiev-pm at pm.org
> http://mail.pm.org/mailman/listinfo/kiev-pm


More information about the Kiev-pm mailing list