В третьей части мы рассмотрим еще два вида операторов — circumfix и postcircumfix. Начнем с более сложного на вид названия.
Postcircumfix
С операторами такого типа вы все встречались: типичный пример — индексирование массива: @a[$i]. Сам по себе оператор — это пара скобок. Операнды (аргументы) оператора — массив и индекс.
Еще два примера — круглые скобки для вызова функции и угловые скобки для создания массива:
my @a = < a b c >;
Создадим свой:
sub postcircumfix:<¿ ?>(Str $question, Str $answer) { say "Q: $question"; say "A: $answer"; } "Hello"¿"World"?;
Эта программа напечатает следующее:
Q: Hello A: World
В качестве домашнего задания, создайте более осмысленный пример оператора этого типа.
Circumfix
Этот тип оператора еще менее похож на оператор, но тем не менее, с точки зрения языка, это полноправный оператор. Рассмотрим пример с теми же символами:
sub circumfix:<¿ ?>(Str $str) { $str.chars } say ¿'Hello, World!'?; # 13
Программа печатает длину строки. Вопросительные знаки стали двумя частями оператора, одна часть стоит до, вторая после операнда.
Если я правильно понимаю, угловые скобки считаются постциркумфиксом, только если они заключают несколько аргументов хеша (как аналог {}): https://docs.perl6.org/language/operators#postcircumfix_. А если они просто создают список (quote-words construct), то нет: https://docs.perl6.org/language/operators#Term_Precedence.
Да, конечно в @a = <a b c> скобки не postcircumfix.