我收到此错误,无法理解为什么会发生这种情况。当我跳到另一个子程序时会发生这种情况。也许我需要了解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。
答案 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
@_
内的$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
表示法来调用函数。这会以你绝对不想要的方式改变行为。
&
要了解有关函数调用如何在Perl中工作的更多信息,请参阅perlsub。