2016-10-21 2 views
1

다른 서브 루틴에 매개 변수로 서브 루틴을 전달하려고합니다.서브 루틴을 다른 서브 루틴의 매개 변수로 전달하는 방법

서브 루틴 question은 서브 루틴 answer에 매개 변수로 전달되어야합니까? Perl로 어떻게 할 수 있습니까?

question(); 

sub question { 
    print "question the term"; 
    return(); 
} 

sub answer() { 
    print "subroutine question is used as parameters"; 
    return(); 
} 
+0

'return' 후에 괄호가 필요하지 않습니다. 더욱 중요한 점은'return; (아무 것도 지정하지 않으면) 실제로'undef'가 리턴된다는 것입니다. 모든 것이 잘되었음을 나타 내기를 원한다면 - 항상 좋은 생각인데 - 일반적으로'return 1;'을합니다. – zdim

+1

스칼라 컨텍스트에서만 @zdim – ysth

+0

@ysth 예, 좋은 지적입니다, 감사합니다. 리스트 컨텍스트에서는이 점에서 다른 게임입니다. – zdim

답변

3

당신은 \&subname 구문을 사용하여 서브 루틴 참조 걸릴 수 있습니다 다음, 당신은 쉽게 스칼라 같은 인수로 다른 서브 루틴에 전달할 수 있습니다. 이 내용은 perlsubperlref에 설명되어 있습니다. 나중에 Arrow operator(->)을 사용하여 역 참조 할 수 있습니다.

sub question { 
    print "question the term"; 
    return 1; 
} 

my $question_subref = \&question; 
answer($question_subref); 

sub answer { 
    my $question_subref = shift; 
    print "subroutine question is used as parameters"; 
    # call it using arrow operator if needed 
    $question_subref ->(); 
    return 1; 
} 

또는 이름을 지정하지 않고 익명 서브 루틴을 만들 수 있습니다. 흥미로운 경우로 이어질 수 있습니다. closures

my $question = sub { 
         print "question the term"; 
         return 1; 
        }; 
answer($question); 

# you can call it using arrow operator later. 
$question ->(); 
+0

만약 내가 다른 서브 루틴을 question1 (지금은 서브 루틴 내에서 대답을 전달할 수있는 질문과 question1 서브 루틴을 전달하고 싶습니다 어떻게 대답 할 수 있습니다) –

+0

question1의 참조를 가져 가라. 즉, 'my $ question1_subref = \ & question1;'과 같이' 대답'. –

+2

* "흥미로운 클로저 케이스로 이어질 수 있습니다."* 문맥과 관련이 없으며 관련이 없습니다. 여기에는 폐쇄가 없습니다. – Borodin

관련 문제