1

このエラーが発生し、なぜこれが起こるのか理解できません。別のサブルーチンにジャンプすると発生します。なぜこれが起こるのか、モジョリシャスについて理解する必要があるかもしれません。

これが私のプログラムのソースコードです:

#!/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 を使用しています。

4

1 に答える 1

3

$cコンテキスト オブジェクト/を 2 番目の関数に渡す必要があり$dます。パラメーターなしで呼び出すため、未定義の値は$cinです。go_somewhere_else

最初に、それを機能させるために、これを行います。

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

  go_somewhere_else($d);
}

これで、名前を付けたコンテキスト (従来の名前ではありません) を他の関数に渡している$dので、警告は消えます。

これは、括弧のないフォーム(&subname;関数への引数のリスト) が の内部で使用可能になるためですが、編集したため、現在は空であるため、内部はです。()@_go_somewhere_elseshift$d@_$cgo_somewhere_elseundef

shiftまたは、 をで割り当てに変更することもできます@_。でも、そうしないでください

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

  &go_somewhere_else;
}

ここには、ほとんど間違っているという点で奇妙なことが他にもあります。

get '/' => sub { &start_home; };

関数をカリー化して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を参照してください。

于 2016-09-23T15:01:37.370 に答える