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使
@
(这是函数的参数列表)在
转到其他地方
中可用,但由于您将
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
@
明确显示了示例之间的差异仅在第一个参数中存在。