[Kiev-pm] Данные из конфига считываются с позиции предыдущего обхода (mojolicious)
vti
viacheslav.t at gmail.com
Sat Oct 27 13:48:16 PDT 2012
Это особенность оператора 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
>
More information about the Kiev-pm
mailing list