От PHP к Perl 6. Строки.

4.6.2016 - 3157 просмотров ;)

Честно я не очень активный пользователь Perl и тем более Perl6, обычно пишу на PHP разные поделки, однако стало интересно что такого в этом Perl6 который выходил десятилетиями и таки кое-как вышел.

Как мы обычно пользуемся строками в PHP ?

  1. Переменные начинаются с $
  2. Переменные интерполируются в двойных кавычках «ля ля $ops ля ля»
  3. Ну бывают многострочные переменные, но кто их использует.. да никто вроде.

А что меня несоклько удивило в строках, читая мануал ? 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.

Статьи из раздела, Видеочат рулетка