Передача Функционального объекта и Вызов его

Следующее должно работать (предположение, что Ваше число является вторым полем на каждой строке).

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt
29
задан Sinan Ünür 5 August 2009 в 17:50
поделиться

4 ответа

Вот полный рабочий сценарий, демонстрирующий то, о чем вы спрашиваете.

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's an array reference: $aref->[0]\n";  # prints 5
    print "Here's a hash ref: $href->{hello}\n";      # prints "world"
}

my @a = (5, 6, 7);
my %h = (hello=>"world", goodbye=>"girl");
f(\@a, \%h);
44
ответ дан 28 November 2019 в 01:22
поделиться

Вы не можете напрямую передать функцию другой функции. Вместо этого вы передаете функции ссылку . Чтобы вызвать функцию, вы разыменовываете ее (как 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 не имеет семантики передачи по имени, но вы можете эмулировать их, используя хэш. Метод вызова функции такой же. Вы разыменовываете его.

sub a { print @_ }

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

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

ObPerl6: Perl 6 будет иметь семантику передачи по имени.

9
ответ дан 28 November 2019 в 01:22
поделиться

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

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

Удачи!

4
ответ дан 28 November 2019 в 01:22
поделиться

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

b( sub { print "Hello World\n"; } );
3
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: