子引用作为参数

Lan*_*nbo 2 perl

另一个Perl-beginner问题,但奇怪的是,我找不到教程来解释这个简单的问题.

作为练习,我希望编写一个函数map,它接受一个函数和一个数组,返回一个数组.在函数式语言中,经常使用它,我听说了子引用以及如何使用它们.

sub map {
  my $f = shift;
  my @r = ();

  foreach (@_) {
    push(@r, &f($_));
  }
  return @r;
}

sub square {
  my $r = shift;
  return $r*$r;
}

print map(\&shift, 1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,我只得到这个词CODE和一个十六进制数作为输出,五次.然后,我已经改变了呼叫fmap,以$$f($_)$f->($_)而这一切有同样的结果.

我在这做错了什么?

J-1*_*DiZ 6

  1. perl具有增强map功能.我们称之为map2

  2. 使用&$f取消引用$f

  3. 用于join正确打印数组


sub map2 {
  my $f = shift;
  my @r = ();

  foreach (@_) {
    push(@r, &$f($_));
  }
  return @r;
}

sub square {
  my $r = shift;
  return $r*$r;
}

print join ",", map2(\&square, 1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
$ perl 1.pl
1,4,9,16,25
Run Code Online (Sandbox Code Playgroud)

  • `&$ f($ _)`也可写为`$ f - >($ _)`,IMO看起来更好.不过,可能只是我. (9认同)