Perl 6 / все про grep

map и grep

Массивы в Perl 6 (будучи объектами класса Array) имеют предопределенные методы map и grep, с помощью которых можно поэлементно обрабатывать массив, формируя новый.

В следующих примерах предполагается, что массив @a содержит целые числа от 1 до 10:

my @a = (1..10);

Метод map последовательно вызывается для каждого элемента массива, выполняет на них определенные действия и формирует новый массив, который и возвращается функцией.

my @b = @a.map:{$_ * 2};
say "@b[]";

Внутри блока кода .map:{} значение очередного элемента принимает переменная $_. Эта переменная — только для чтения. Полученное в блоке значение присваивается соответствующему элементу нового массива. В показанном примере получится строка из элементов с удвоенными значениями:

2 4 6 8 10 12 14 16 18 20

Метод grep отсеивает элементы, ориентируясь на условие, заданное в его блоке кода:

my @c = @a.grep:{$_ % 2};
say "@c[]";

Условие $_ % 2 отбирает элементы, значение которых является четным числом. Элементы, для которых условие выполняется, попадают в выходной массив. Программа напечатает строку

1 3 5 7 9

Более сложный пример, отбирающий элементы со значением 4, 5 и 8, и содержащий обращение к дополнительной функции:

my @d = @a.grep:{$_ == any(condition())}.join(', ').say;
 
sub condition()
{
   return (4, 5, 8);
}

map, grep — 6 мая 2007