2016-09-23 10 views
1

このエラーが発生しており、なぜこのようなことが起こるのか理解できません。私は別のサブルーチンにジャンプするときに起こります。おそらく、なぜこれが起こるのかについてMojoliciousについて理解する必要があるものがあります。ここでMojolicious:定義されていない値でメソッド "render"を呼び出すことができません。

は私のプログラムのソースコードです:

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

答えて

3

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

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

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

    &go_somewhere_else; 
} 

はほとんどここで間違ってのポイントに奇数より多くのものがあります。

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

あなたはcurryingstart_home機能ですが、あなたが実際に別のパラメータを追加していません。私は上記の理由を説明しました。しかしそれは素晴らしいことではありません。実際、混乱し複雑です。

代わりに、ルートのコード参照を使用する必要があります。 start_homeの内部

get '/' => \&start_home; 

慣例があるとして、あなたはあなたのコンテキスト$cを呼び出す必要があります。関数を呼び出すためのアンパサンド&表記も使用しないでください。それはあなたが最も望ましくない方法で行動を変えます。

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

    # ... 
    go_somewhere_else($c); 
} 

関数呼び出しがPerlでどのように機能するかについては、perlsubを参照してください。

+0

@Eugen編集が正しくありません。その最初のコードブロックの全体的な考え方は、関数内で '@ _ 'が空であるため、それを渡す必要は全くありません。私は以下の段落でそれを説明します。私はあなたの編集をロールバックしました。 – simbabque

+0

この場合、1番目と2番目の例は異なった動作をします。 'start_home'が2つ以上の引数を取得した場合、最初の例はそれらをすべて破棄しますが、2番目の例はそれらを通過します。最初の例で '@ _ 'を通すと、最初の引数でのみ例の違いが明示的に示されます。 –

関連する問題