Функция map
имеет очень магический синтаксис, и вы, вероятно, не захотите копировать ее, если у вас нет действительно веской причины; просто используйте обычный анонимный саб, как это:
something(sub { print $_[0], "hi\n" });
Если вы действительно хотите это сделать, вам нужно использовать прототип :
sub my_map (&@) {
my ($func, @values) = @_;
my @ret;
for (@values) {
push @ret, $func->($_);
}
return @ret;
}
my @values = my_map { $_ + 1 } qw(1 2 3 4);
print "@values"; # 2 3 4 5
(Обратите внимание, что $_
динамически ограничен, поэтому любое значение, которое он имеет в вызывающем, сохраняется в функции.)
List::Util
и List::MoreUtils
много делают для создания функций, которые выглядят встроенными и действуют как варианты map
/ grep
. Это действительно единственный случай, когда нужно использовать что-то подобное.