我想将一个函数应用于列表的每个项目,并在python中存储类似于map(function, list)
的结果。
试图传递一个函数来映射,但是得到了这个错误:
perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.
这样做的正确方法是什么?
答案 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;