Честно я не очень активный пользователь Perl и тем более Perl6, обычно пишу на PHP разные поделки, однако стало интересно что такого в этом Perl6 который выходил десятилетиями и таки кое-как вышел.
Как мы обычно пользуемся строками в PHP ?
А что меня несоклько удивило в строках, читая мануал ? http://examples.perl6.org/categories/cookbook/01strings/01-00introduction.html
Как обычно видимо скаляры имеют глобальную видимость, поэтому в примерах приписывают слово my, что бы сделать переменную локальной:
my Str $string = 'This Str is holding a String';
Далее видно что добавляют Str, это объявляет тип, чего вроде не было в Perl5. Теперь все фанаты типизированных языков пляшут. Однако как и в PHP7 (опять же насколько я понимаю) это вовсе не обязательно типизировать. Оно умеет типизироваться и из коробки.
Можно было бы так же написать:
$string = 'asdas';
И это норма.. проверям в Rakudo Perlи боженьки.. без my не работает ! т.е. как теперь глобальные переменные определять — еще не понял. Дисциплинируют..
Конкатенация в Perl6 теперь делается через тильду
$str = "Hello" ~ " World" ~ "!";
Очень необычное решение, оно против Perl5/PHP и против JavaScript, и вообще против всех.. я такой конкатенации нигде вроде не встречал даже.
Кстати теперь можно написать как в Ruby:
$str.say;
Очень лаконично и приятно.. мне такой подход очень нравится. Да мне вообще нравился Ruby со своим объекстным подходом, и тем что он многое позаимствовал из Perl.
А вот так мы можем узнать тип переменной:
say $a.^name
Интерполяция массивов в строке выглядит так:
my @animal = ("fox", "dog"); say "The quick brown @animal[0] jumps over the lazy @animal[1]";
Кажется так оно и работало. За исключением того что в Perl5 надо было все таки писать :
my @animal = ("fox", "dog"); say "The quick brown $animal[0] jumps over the lazy $animal[1]";
И еще можно так (методы, замыкания, функции):
say "@animal.elems() {@animal.elems} &elems(@animal)";
Странная возможность Perl вместо кавычек возможность использовать какие-то странные выделения:
say q/This string allows 'single quotes' seamlessly/; say qq/This string allows "single quotes" seamlessly/;
Да и вот так можно конечно же:
say q'Many delimiters are available for quoting'; say q"Many delimiters are available for quoting"; say q`Many delimiters are available for quoting`; say q[Many delimiters are available for quoting]; say q<Many delimiters are available for quoting>; say q{Many delimiters are available for quoting}; say q?Many delimiters are available for quoting?;
Богато но необходимо ли ? не ясно..
Но это лишь капля, дальше начинается АДищще, т.к. у функции q могут быть некие постфиксы, которые определяют методы интерполяции последующей строки:
say q:s:a/The quick brown $fox jumps over the lazy @animal[1]/;
Разных методов там полно, приводить описание не буду, слишком скучно, а вот следующий пример совсем безбашки:
my ($fox,$dog) = q:w/brown lazy/;
т.е. :w — разбил строку по словам и вернул список или массив, смотря какой контекст.
Можно было и так написать:
my @array = qw/fox dog/;
Красивее и аккуратнее, этакая простая замена split. Однако эту конструкцию решили упростить еще следущий образом:
@animals = <fox dog monkey>;
В этом примере будет массив из трех слов. а в следующем вообще хэш:
%animal = <brown fox lazy dog>; say %animal<lazy> ; # dog
Дальше хочется сказать, боженьки мой, что же они творят, это люди без границ в голове.. Было бы глуппо уметь дробить только по словам и все.. поэтому пожалуйста дробите по кавычкам как попало:
@animals = q:ww<"brown fox" "lazy dog">; @animals = qq:ww/"brown $fox" "lazy %animal{'lazy'}"/;
От таких примеров может понемногу начинать сворачиваться голова, таких фич ни в каком таком PHP вы никогда не увидите.
И это я бы сказал только поверхность, есть еще eval-ы, heredoc и другой 100500 вагонов, которые гонятся за паровозом Perl6
Резюме:
Овладея всей этой магией запятых и кавычек мне кажется можно будет писать совершенно на другом уровне, как бы в другой вселенной, однако это всего лишь про строки, Остальное как неразгаданная загадка манит почитать недописанный мануал Perl6.
Ну и конечно хочется сравнить это с PHP, который гонится совсем в другую сторону. Мне всегда были интересны ньюансы работы с Perl, и почему-то всегда скучно узнавать что-то новое о PHP. Ну так уж повелось.. и этот снобизм во мне врядли кто-нибудь убьет, разве что Ruby может, ну уж точно не Go и не Rust.