2016-09-23 2 views
1

Я получаю эту ошибку и не могу понять, почему это происходит. Это происходит, когда я перехожу к другой подпрограмме. Возможно, есть кое-что, что мне нужно понять о Mojolicious о том, почему это происходит.Mojolicious: Не удается вызвать метод «render» по неопределенному значению

Вот исходный код моей программы:

#!/usr/bin/perl 

use Mojolicious::Lite; 

get '/' => sub { &start_home; }; 

app->start; 

sub start_home { 
    my $d = shift; 
    my $something = $d->param('something'); 
    ### Do things with $something.... etc.. etc.. 
    &go_somewhere_else; ### Go somewhere else 
} 

sub go_somewhere_else { 
my $c = shift; 
$c->render(text => "Hello World!"); 
### End of program 
} 

Я передаю значение на визуализатора и есть значение - Почему бы это сказать, что это не определено? Я понимаю, что это происходит только в том случае, если вы переходите к подпрограмме и пытаетесь сделать вывод.

Моя операционная система - это Windows, и я использую Strawberry Perl.

ответ

3

Вам необходимо передать объект контекста $c/$d вашей второй функции. неопределенное значение является вашим $c в go_somewhere_else, потому что вы называете его без параметра.

Первоначально, чтобы заставить его работать, сделайте это.

sub start_home { 
    my $d = shift; 
    my $something = $d->param('something'); 

    go_somewhere_else($d); 
} 

Вы теперь пропусканием контекст, который вы назвали $d (это не условное название), к другой функции, и предупреждение исчезнет.

Это потому, что форма &subname; без скобок () делает @_ (это список аргументов функции), доступных внутри go_somewhere_else, а потому, что вы shift редактор $d выключен, @_ теперь пуст, и, следовательно, ваш $c внутри go_somewhere_else является undef ,

Кроме того, вы также можете изменить shift на задание @_. Но, пожалуйста, не делаем это!

sub start_home { 
    my ($d) = @_; 
    my $something = $d->param('something'); 

    &go_somewhere_else; 
} 

Есть больше вещей нечетными к точке почти здесь не так.

get '/' => sub { &start_home; }; 

Вы currying функция start_home, но вы на самом деле не добавить еще один параметр. Я объяснил, почему это работает. Но это не здорово. На самом деле это запутанно и сложно.

Вместо этого вы должны использовать ссылку на код для маршрута.

get '/' => \&start_home; 

Внутри start_home, вы должны вызвать ваш контекст $c, как это принято. Вы также не должны использовать нотацию амперсанда & для вызовов функций. Это изменяет поведение таким образом, которого вы, разумеется, не хотите.

sub start_home { 
    my $c = shift; 
    my $something = $c->param('something'); 

    # ... 
    go_somewhere_else($c); 
} 

Чтобы узнать больше о том, как вызовы функций работы в Perl, обратитесь к perlsub.

+0

@Eugen Ваше изменение было неправильным.Вся идея этого первого блока кода заключается в том, что '@ _' пуст в функции, поэтому нет необходимости передавать его. Я объясняю это в нижеследующем параграфе. Я откатил ваше редактирование. – simbabque

+0

Первый и второй примеры работают в этом случае по-разному. Если 'start_home' получит два или более аргумента, первый пример отбросит их всех, но второй пройдет через них. Прохождение через '@ _' в первом примере явно показывает, что разница между примерами только при первом аргументе. –

Смежные вопросы