如何使用map将函数应用于列表?

时间:2010-11-18 13:53:22

标签: perl map

我想将一个函数应用于列表的每个项目,并在python中存储类似于map(function, list)的结果。

试图传递一个函数来映射,但是得到了这个错误:

perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:9)

如果标量变量包含代码引用 - 例如:

my $double = sub { 2 * shift };

您可以像在Python中那样调用代码,如下所示:

$double->(50);  # Returns 100.

将其应用于map示例:

my @doubles = map $double->($_), 1..10;

或者这样:

my @doubles = map { $double->($_) } 1..10;

第二个变体更健壮,因为{}大括号定义的块可以包含任意数量的Perl语句:

my @doubles = map {
    my $result = 2 * $_;

    # Other computations, if needed.

    $result;  # The return of each call to the map block.
} 1..10;

答案 1 :(得分:5)

尝试:map { $s->($_) } (0..9)而不是map $s 0..9

解释:在您的示例中,$s是对子例程的引用,因此您必须取消引用它以允许子路径调用。这可以通过多种方式实现:$s->()&$s()(可能还有其他一些我忘记的方式)

答案 2 :(得分:4)

  my $squared = sub {
        my $arg = shift();
        return $arg ** 2;
  };

然后

   my @list = map { &$squared($_)  } 0 .. 12;

   my @list = map { $squared->($_) } 0 .. 12;

或者

my $squared;
BEGIN {
    *Squared = $squared = sub(_) {
        my $arg = shift();
        return $arg ** 2;
    };
}
my @list = map { Squared } 0 .. 12;

答案 3 :(得分:2)

与Python没有什么不同。

@results = map { function($_) } @list;
@results = map function($_), @list;

或“lambdas”,

@results = map { $function->($_) } @list;
@results = map $function->($_), @list;