Mojolicious:无法在未定义的值上调用方法“render”

时间:2016-09-23 14:45:07

标签: perl mojolicious mojolicious-lite

我收到此错误,无法理解为什么会发生这种情况。当我跳到另一个子程序时会发生这种情况。也许我需要了解Mojolicious为何会发生这种情况。

以下是我的程序的源代码:

#!/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。

1 个答案:

答案 0 :(得分:3)

您需要将上下文对象$c / $d传递给第二个函数。 未定义值$c中的go_somewhere_else,因为您在没有参数的情况下调用它。

最初,为了使其发挥作用,请执行此操作。

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

  go_somewhere_else($d);
}

您现在将名为$d(不是传统名称)的上下文传递给另一个函数,警告将消失。

那是因为没有括号&subname;的{​​{1}}形式使()内的@_(这是函数的参数列表)可用,但是因为你{{1} } go_somewhere_else已关闭,shift现在为空,因此$d @_内的$cgo_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表示法来调用函数。这会以你绝对不想要的方式改变行为。

&

要了解有关函数调用如何在Perl中工作的更多信息,请参阅perlsub