https://docs.perl6.org/language/operators
Операторов ооочень много, я их пока все не запомнил. Ниже будут примеры.
Операторы могут быть в разных позициях применения:
Operator classification Operators can occur in several positions relative to a term:
+term | prefix |
term1 + term2 | infix |
term++ | postfix |
(term) | circumfix |
term1[term2] | postcircumfix |
prefixСоздание своих операторов в Perl 6, часть 1 (https://perl6.ru/2018/01/13/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d1%81%d0%b2%d0%be%d0%b8%d1%85-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2-%d0%b2-perl-6-%d1%87%d0%b0%d1%81%d1%82%d1%8c-1/)
sub prefix:<§>($str) {
$str.uc
}
say §'hello, world!'; # HELLO, WORLD!
sub prefix:<🔊>(Str $str) {
$str.uc
}
say 🔊'hello, world!';
infixСоздание своих операторов в Perl 6, часть 2 (https://perl6.ru/2018/01/15/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d1%81%d0%b2%d0%be%d0%b8%d1%85-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2/)
https://docs.perl6.org/language/operators#Dotty_Infix_Precedence
sub infix:<≈>($a, $b) {
abs($a) - abs($b) < 1
}
say 3.14 ≈ pi; # True
postfixhttps://docs.perl6.org/language/operators#postfix_.
sub postfix:<!>(Int $n) {
[*] 1..$n
}
say 5!; # 120
circumfixsub circumfix:<¿ ?>(Str $str) {
$str.chars
}
say ¿'Hello, World!'?;
# 13
postcircumfixMethod Postfix Precedence (https://docs.perl6.org/language/operators#Method_Postfix_Precedence)
Создание своих операторов в Perl 6, часть 3 (https://perl6.ru/2018/01/16/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d1%81%d0%b2%d0%be%d0%b8%d1%85-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2-%d0%b2-perl-6-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3/)
sub postcircumfix:<¿ ?>(Str $question, Str $answer) {
say "Q: $question";
say "A: $answer";
}
"Hello"¿"World"?;
# Q: Hello
# A: World
Reversed operator (https://docs.perl6.org/language/operators#Reversed_Operators)
Реальный пример из модуля zef:
my $meta6-prefix = '' R// $!extractor.ls-files($candi.uri).sort.first({ .IO.basename eq 'META6.json' });
Символ
R перед оператором
// меняет порядок проверки сторон на противоположный.
Сначала будет проверено значение правой части от
R// и если оно не определено, то тогда результатом будет значение слева.
Напомним, что оператор
// это
defined-or operator:
say Any // 0 // 42; # 0
Ещё пример из документации:
say 4 R/ 12; # OUTPUT: «3»
say [R/] 2, 4, 16; # OUTPUT: «2»