Perl 莫乔利:可以';t调用方法";渲染“;关于未定义的值
我得到了这个错误,无法理解为什么会发生这种情况。它发生在我跳转到另一个子例程时。也许我需要了解莫乔利西奥为什么会这样 以下是我的程序的源代码:Perl 莫乔利:可以';t调用方法";渲染“;关于未定义的值,perl,mojolicious,mojolicious-lite,Perl,Mojolicious,Mojolicious Lite,我得到了这个错误,无法理解为什么会发生这种情况。它发生在我跳转到另一个子例程时。也许我需要了解莫乔利西奥为什么会这样 以下是我的程序的源代码: #!/usr/bin/perl use Mojolicious::Lite; get '/' => sub { &start_home; }; app->start; sub start_home { my $d = shift; my $something = $d->param('something');
#!/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,我使用的是草莓Perl。您需要将上下文对象
$c
/$d
传递给第二个函数。未定义的值是转到其他地方
中的$c
,因为您调用它时没有参数
首先,要使其工作,请这样做
sub start_home {
my $d = shift;
my $something = $d->param('something');
go_somewhere_else($d);
}
现在,您正在将名为$d
(这不是常规名称)的上下文传递给另一个函数,警告将消失
这是因为表单&subname不带括号的code>使@
(这是函数的参数列表)在转到其他地方
中可用,但由于您将shift
ed$d
关闭,@
现在为空,因此您的$c
在转到其他地方
是未定义的
或者,您也可以将shift
更改为带有@
的作业。但是请不要那样做
sub start_home {
my ( $d ) = @_;
my $something = $d->param('something');
&go_somewhere_else;
}
这里有更多奇怪的事情,几乎是错的
get '/' => sub { &start_home; };
您是start\u home
函数的执行者,但实际上并没有添加其他参数。我在上面解释了为什么这样做。但这并不好。事实上,这是令人困惑和复杂的
相反,您应该为路由使用代码引用
get '/' => \&start_home;
在start\u home
内部,您应该按照惯例调用上下文$c
。调用函数时也不应使用符号和&
。这会以你最不希望的方式改变行为
sub start_home {
my $c = shift;
my $something = $c->param('something');
# ...
go_somewhere_else($c);
}
要了解有关函数调用在Perl中如何工作的更多信息,请参阅。@Eugen您的编辑不正确。第一个代码块的全部思想是,@
在函数中是空的,因此绝对不需要传递它。我在下面一段中解释这一点。我回滚了您的编辑。在本例中,第一个和第二个示例的工作方式不同。如果start\u home
获取两个或多个参数,第一个示例将丢弃所有参数,但第二个示例将通过它们。第一个示例中的Pass-through@
明确显示了示例之间的差异仅在第一个参数中存在。