Всем привет.
Сегодня понедельник, время Perl-поста. Скажу еще более пафосно: сегодня последний понедельник для Perl 6 в этой ленте. Да, заканчивается месячник Perl 6, думаю, он изрядно тут уже всем поднадоел :-)
Так или иначе, осталось рассмотреть совсем немного. И на очереди — «Метаоператоры».
Предназначение мета-операторов — сделать процесс вычислений массивов таким же простым, как и скаляров. По сути, семантика осталась такой же, как и при работе со скалярами. Просто привычные операторы мы заключаем в квадратные скобки: [].
# Суммирует все значения массива в отдельной переменной
my $sum = [+] @values;
# Вычисление факториала (1 * 2 * 3 * ... * 10)
my $fact = [*] 1..10;
# Проверяет упорядочен ли массив
if [<=] @values { ... }
Гипер-операторы
Получает оператор и производит вычисления с каждым элементом массива, создавая новый массив:
my @a = 1,2,3;
my @b = 4,5,6;
my @c = @a >>+<< @b; # 5 7 9
my @d = @a >>*<< @b; # 4 10 18
Можно изменить последний элемент, если надо:
my @e = @a >>+>> 1; # 1 2 4
Операторы пересечения
Позволяет создавать всевозможные объединения двух и более списков:
my @a = 1,2;
my @b = 'a', 'b';
say (@a X @b).perl; # ["1", "a", "1", "b",
# "2", "a", "2", "b"]
Можно также объединить каждый элемент списка с соответствующим элементом другого:
say (@a X~ @b).perl; # ["1a", "1b",
# "2a", "2b"]
Оператор Z создает один массив из двух с перемешанными между собой элементами (Zipper):
say (@a Z @b).perl; # 1a2b






































24 августа 2009, 10:02
Все эти "мегаоператоры" являются просто-напросто проявлениями более абстрактных весчей.
> my $sum = [+] @values;
> my $fact = [*] 1..10;
Делается с помощью свертки (fold).
> my @c = @a >>+ my @d = @a >>* say (@a X~ @b).perl; # ["1a", "1b", "2a", "2b"]
Декартово произведение множеств и применение какой-то функции.
Остается вопрос, зачем встраивать это все в язык? :)
24 августа 2009, 12:20
24 августа 2009, 12:47
Это затрудняет реализацию, тестирование и сопровождение Перла (именно самого Перла). Недаром его уже шестой раз переписывают. :)
Ну и другие недостатки есть.
24 августа 2009, 13:00
К этому еще прибавьте полушутливое выражение того же Ларри, что язык не считается полным, если в нем не используются все символы, которые можно набрать с клавиатуры :-)
24 августа 2009, 10:04
> my @c = @a >>+ my @d = @a >>*
24 августа 2009, 10:05