我想对列表的每个元素应用一个函数并将结果存储,类似于Python中的 map(function, list)
。
尝试使用map
函数并传递一个函数,但是出现了以下错误:
perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.
这该怎么做才是正确的?
我想对列表的每个元素应用一个函数并将结果存储,类似于Python中的 map(function, list)
。
尝试使用map
函数并传递一个函数,但是出现了以下错误:
perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.
这该怎么做才是正确的?
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;
尝试使用 map { $s->($_) } (0..9)
替代 map $s 0..9
解释:在你的例子中,$s
是一个子程序的引用,因此必须对其进行解引用以允许调用子程序。这可以通过多种方式实现:$s->()
或 &$s()
(还有可能我忘记的其他方式)。
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;
这与Python并没有太大的不同。
@results = map { function($_) } @list;
@results = map function($_), @list;
@results = map { $function->($_) } @list;
@results = map $function->($_), @list;
use ...
/no ...
)。 - Eric Strom