2016-09-23 52 views
1

我收到此錯誤,無法理解爲什麼會發生這種情況。當我跳到另一個子程序時會發生這種情況。也許我需要了解一下Mojolicious爲什麼發生這種情況。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。

回答

3

您需要將上下文對象$c/$d傳遞給第二個函數。 未定義的值是您的$cgo_somewhere_else,因爲您在沒有參數的情況下調用它。

最初,爲了使其工作,請執行此操作。

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

    go_somewhere_else($d); 
} 

您現在已經傳遞上下文,你叫$d(這不是常規的名稱),其他功能,並警告將消失。

這是因爲形式&subname;沒有括號()使得@_(這就是函數的自變量列表)可用的go_somewhere_else裏面,而是因爲你shift$d關閉,@_現在是空的,因此你$cgo_somewhere_elseundef

或者,您也可以將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因爲是慣例。您也不應使用符號&表示法來調用函數。這改變了你絕對不想要的方式。

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

    # ... 
    go_somewhere_else($c); 
} 

要了解更多關於函數調用如何在Perl中工作的信息,請參考perlsub

+0

@Eugen你的編輯不正確。第一個代碼塊的整個想法是'@ _'在函數中是空的,所以絕對不需要傳遞它。我在下面的段落中解釋。我回滾了你的編輯。 – simbabque

+0

在這種情況下,第一個和第二個示例的工作方式不同。如果'start_home'獲得兩個或更多參數,第一個示例將丟棄所有參數,但第二個參數將通過它們。在第一個例子中,通過「@ _」直接顯示了僅在第一個參數處的示例之間的區別。 –

相關問題