Передача объекта функции и вызов его

Как передать функцию, a, для функции, b и иметь b вызов a в Perl?

Ответ 1

Здесь полный рабочий стол script, который демонстрирует, что вы просите.

sub a { print "Hello World!\n"; }

sub b {
    my $func = $_[0];
    $func->();
}

b(\&a);

Вот объяснение: вы берете ссылку на функцию a, говоря \&a. В этот момент у вас есть функция ссылки; в то время как обычно функция вызывается, говоря func(), вы вызываете ссылку на функцию, говоря $func->()

Синтаксис -> также относится к другим ссылкам. Например, здесь приведен пример работы с массивами и хеш-ссылками:

sub f {
    my ($aref, $href) = @_;
    print "Here an array reference: $aref->[0]\n";  # prints 5
    print "Here a hash ref: $href->{hello}\n";      # prints "world"
}

my @a = (5, 6, 7);
my %h = (hello=>"world", goodbye=>"girl");
f(\@a, \%h);

Ответ 2

Вы не можете напрямую передать функцию другой функции. Вместо этого вы передаете ссылку на функцию. Чтобы вызвать функцию, вы разыскиваете ее (в качестве ссылки CODE ref) с помощью ->();

sub a { print @_ }

sub b {
  my $f = shift;  # assuming that $f is a function reference...
  $f->(@_);       # call it with the remaining arguments
}

b(\&a, "hello, world!");  # prints "hello, world!"

Perl не имеет семантики pass-by-name, но вы можете имитировать их с помощью хэша. Метод вызова функции тот же. Вы разыгрываете его.

sub a { print @_ }

sub b {
    my %arg = @_;
    $arg{function}->(@{$arg{arguments}});
}

b(function => \&a, arguments => ["hello, world!"]);

ObPerl6: Perl 6 будет иметь семантику pass-by-name.

Ответ 3

Вы можете получить доступ к ссылкам подпрограмм как \&my_method в Perl и вызвать эти ссылки с помощью $myref->();. Попробуйте следующее:

perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);'

Удачи!

Ответ 4

Следуя примеру Eli Courtwright: если вы используете только одну функцию один раз, вы также можете вызвать b с анонимной функцией, например:

b( sub { print "Hello World\n"; } );