Как я могу применить функцию к списку, используя карту? - PullRequest
9 голосов
/ 18 ноября 2010

Я хочу применить функцию к каждому элементу списка и сохранить результаты, подобные map(function, list) в python.

Пытался передать функцию на карту, но получил эту ошибку:

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

Как правильно это сделать?

Ответы [ 4 ]

9 голосов
/ 18 ноября 2010

Если скалярная переменная содержит ссылку на код - например:

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;
5 голосов
/ 18 ноября 2010

попробуй: map { $s->($_) } (0..9) вместо map $s 0..9

Объяснение

: в вашем примере $s является ссылкой на подпрограмму, поэтому вы должны разыменовать ее, чтобы разрешить вызов подпрограммы. Это может быть достигнуто несколькими способами: $s->() или &$s() (и, возможно, некоторыми другими способами, которые я забыл)

4 голосов
/ 18 ноября 2010
  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;
2 голосов
/ 18 ноября 2010

Это не слишком отличается от Python.

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

или с "лямбдами",

@results = map { $function->($_) } @list;
@results = map $function->($_), @list;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...