Mojolicious:无法对未定义的值调用方法 "render"

Mojolicious: Can't call method "render" on an undefined value

我遇到了这个错误,不明白为什么会这样。当我跳转到另一个子程序时会发生这种情况。关于为什么会发生这种情况,也许我需要了解有关 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。

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

最初,要使其正常工作,请执行此操作。

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

  go_somewhere_else($d);
}

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

那是因为不带括号 () 的形式 &subname; 使得 @_(函数的参数列表)在 go_somewhere_else 中可用,但是因为你 shift关闭 $d@_ 现在是空的,因此 go_somewhere_else 中的 $cundef.

或者,您也可以将 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