Программисты Perl 5 сталкивались с такой структурой в коде:
my @new = sort { ... } map { ... } grep { ... } @original;
Здесь данные идут справа налево, от массива @original
, который скармливают в grep, который, в свою очередь, скармливает данные в map, а тот в sort, и в конце всё это присваивается массиву @new
. Каждый из них принимает список в качестве аргумента.
В Perl 6 потоки данных передаются непосредственно через скармливающий оператор. Представленный пример можно записать в таком виде в Perl 6:
my @new <== sort { ... } <== map { ... } <== grep { ... } <== @original;
Принцип TMTOWTDI никуда не делся. Это же можно записать почти так же, как это было в Perl 5:
my @new = sort { ... }, map { ... }, grep { ... }, @original;
Разница только в запятых.
Что же даёт нам этот оператор? Читая код, вы делаете это слева направо. В коде Perl 5 вы можете прочитать пример слева направо, а потом окажется, что работает он справа налево. В Perl 6 появился синтаксический маркер, который наглядно показывает направление потока данных.
Чтобы улучшить читаемость кода и повернуть поток данных в нужном направлении, слева направо, существует специальный скармливающий оператор:
@original ==> grep { ... } ==> map { ... } ==> sort { ... } ==> my @new;
Работает это точно так же, как и предыдущий вариант, просто данные идут слева направо. Вот ещё примеры реального применения этого оператора в коде:
my @random-nums = (1..100).pick(*);
my @odds-squared <== sort() <== map { $_ ** 2 } <== grep { $_ % 2 } <== @random-nums;
say ~@odds-squared;
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people ==> grep { /at/ } ==> map { .ucfirst } ==> my @who-it's-at;
say ~@who-it's-at;
Автор: SLY_G