Следующее должно работать (предположение, что Ваше число является вторым полем на каждой строке).
awk 'BEGIN {sum=0} \
{sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt
Вот полный рабочий сценарий, демонстрирующий то, о чем вы спрашиваете.
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);
Вы не можете напрямую передать функцию другой функции. Вместо этого вы передаете функции ссылку . Чтобы вызвать функцию, вы разыменовываете ее (как 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 будет иметь семантику передачи по имени.
Вы можете получить доступ к ссылкам на подпрограммы как \ & my_method
в Perl и вызывать эти ссылки с помощью $ myref -> ();
. Попробуйте следующее:
perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);'
Удачи!
Следуя примеру Эли Кортрайта: если вы используете только первую функцию один раз, вы также можете вызвать b
с анонимной функцией, например:
b( sub { print "Hello World\n"; } );