2016-09-23 4 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을 전달해야합니다. 정의되지 않은 값은 이 go_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_else 내부는 undef입니다 .

또는 shift@_이라는 할당으로 변경할 수도 있습니다. 하지만 제발, do not do!

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

    &go_somewhere_else; 
} 

거의 잘못 여기의 지점에 이상한 가지 더있다.

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

당신은 currying하여 start_home 기능이지만, 실제로 다른 매개 변수를 추가하지 않습니다. 나는 이것이 왜 작동 하는지를 위에서 설명했다. 그러나 그것은 위대하지 않습니다. 사실 혼란스럽고 복잡합니다.

대신 경로에 대한 코드 참조를 사용해야합니다. 컨벤션 그대로 start_home의 내부

get '/' => \&start_home; 

, 당신은 당신의 상황 $c를 호출해야합니다. 호출 함수에는 앰퍼샌드 & 표기법을 사용하지 않아야합니다. 그것은 당신이 가장 원하지 않는 방식으로 행동을 변화시킵니다.

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

    # ... 
    go_somewhere_else($c); 
} 

perlsub를 참조 기능이 Perl로 작업을 호출하는 방법에 대한 자세한 내용은.

+0

@Eugen 수정 사항이 올바르지 않습니다.첫 번째 코드 블록에 대한 전체적인 생각은 함수에서'@ _ '이 비어 있다는 것입니다. 따라서 그것을 전달할 필요가 전혀 없습니다. 나는 아래 단락에서 그것을 설명한다. 편집을 취소했습니다. – simbabque

+0

첫 번째와 두 번째 예제는이 경우 다르게 작동합니다. 'start_home'가 두 개 이상의 인자를 얻는다면 첫 번째 예제는 모두 버리고 두 번째 인자는 모두 무시합니다. 첫 번째 예제에서 '@ _'를 통과하면 첫 번째 인수에서만 예제 간의 차이가 명시 적으로 표시됩니다. –