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'. Что еще более важно, обратите внимание, что 'return;' (без чего-либо) фактически возвращает 'undef'. Если вы хотите указать, что все прошло хорошо - это всегда очень хорошая идея, вы обычно делаете 'return 1;'. – zdim

+1

@zdim только в скалярном контексте – ysth

+0

@ysth Да, хороший момент, спасибо. В контексте списка это - другая игра, в этом смысле. – zdim

ответ

3

Вы можете воспользоваться подпрограммой ссылки, используя \&subname синтаксис, а затем, вы можете легко передать его в другую подпрограмму в качестве аргументов как скаляр. Это подтверждено в perlsub и perlref. Позже вы можете разыменовать его, используя 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

Если у меня есть другая подпрограмма, называемая вопросом1 (теперь я хочу передать вопрос и подпрограмму question1 внутри ответа подпрограммы, как это может передать) –

+0

Возьмите ссылку на вопрос1, например вопрос 'my $ question1_subref = \ & question1;', и передайте его в sub ' answer'. –

+2

* «Это может привести к интересному случаю закрытия» * Это не имеет значения и вне контекста. Здесь нет закрытия. – Borodin

Смежные вопросы