Perl, используя coderef в качестве параметра для подпрограммы - PullRequest
0 голосов
/ 04 декабря 2011

У меня есть следующие подпрограммы:

sub my_sub {
    my $coderef = shift;    
    $coderef->();
}


sub coderef {
    my $a = shift;
    my $b = shift;

    print $a+$b;
}

и хочу вызвать my_sub(\coderef($a,$b)) таким образом, т.е. я хочу предоставить аргументы кода ref с ним и запустить его в функции my_sub. Можно ли сделать что-то подобное в Perl?

Ответы [ 5 ]

8 голосов
/ 04 декабря 2011

Если эти подводные лодки должны быть приняты по номинальной стоимости, my_sub ничего не делает.

Здесь происходит две вещи:

  1. Определитьcoderef

    my $adder = sub { my ( $first, $second ) = @_; $first + $second };
    
    # Adds first two arguments
    
  2. Выполните его с необходимыми параметрами

    print $adder->(2,3);  # '5'
    

Предполагая, что my_sub является своего родафунктор, которому передается coderef в качестве первого аргумента:

sub functor {
    my $coderef = shift;  # Pull of first argument
    $coderef->( @_ );     # Rest of @_ are coderef arguments
                          # Or simply : sub functor { +shift->( @_ ) }
}

# Usage:

print functor ( $adder, 2, 3 );  # '5'
4 голосов
/ 04 декабря 2011

Если я правильно понимаю ваш вопрос, вам нужно поместить вызов в вашу подпрограмму coderef в другую анонимную подпрограмму, например:

my_sub(sub { coderef(2, 3); }); # replace 2, 3 with whatever arguments 
2 голосов
/ 04 декабря 2011

Это то, что вы хотите?

use warnings;
use strict;

&my_sub( \&coderef );

sub my_sub {
    my $coderef = shift;
    $coderef->(2, 3);
}

sub coderef {
    my $a= shift;
    my $b = shift;

    print $a+$b;
}
1 голос
/ 09 декабря 2011

Еще одна идея. Возможно закрытие решает вашу проблему? Если вы напишите coderef как фабрику, то вы можете написать так:

use strict;
use warnings;

my_sub(coderef(2,3));

sub my_sub {
  my $coderef = shift;    
  $coderef->();
}

sub coderef {
    my $a = shift;
    my $b = shift;

    return sub { print $a + $b };
}

OUTPUT

5
1 голос
/ 04 декабря 2011

Использовать анонимную подпрограмму.

my $coderef = sub {
    my ($aa, $bb) = @_;
    print $aa + $bb;
};

sub my_sub {
    my ($c_ref, @params) = @_;
    $c_ref->(@params);
}

my_sub($coderef, 2, 3);
...