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