2016-10-21 3 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;(何もせずに)実際には' 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

関連する問題