...

среда, 18 марта 2015 г.

[Перевод] Perl 6: Разные названия для разных вещей

Новички в Perl 5 жалуются, что в языке нет инструмента для реверса строк. Функция reverse есть, но она почему-то не работает:

$ perl -E "say reverse 'привет'"
привет


Набрав опыта, они находят решение. Функция работает в двух режимах. В списковом контексте она реверсирует списки, а в скалярном – строки:



$ perl -E "say scalar reverse 'привет'"
тевирп






К сожалению, это – исключение из контекстной модели Perl. Большинство операторов и функций определяют контекст, после чего данные интерпретируются в этом контексте. + и * работают с числами,. работает со строками. Поэтому символ (или имя функции типа uc) определяет контекст. В случае с reverse это не так.

В Perl 6 мы учли ошибки прошлого. Поэтому реверс строк, списков, и инвертирование хэшей разделены:



# реверс строк – то бишь, переворот:
$ perl6 -e 'say flip "привет"'
тевирп

# реверс списков
# perl6 -e 'say join ", ", reverse <ab cd ef>'
ef, cd, ab

# инвертирование хэшей
perl6 -e 'my %capitals = Франция => "Париж", Англия => "Лондон";
say %capitals.invert.perl'
("Париж" => " Франция ", " Лондон " => " Англия ")


При инвертировании хэшей тип результата отличается от типа ввода. Поскольку значения хэшей не обязательно различаются, инвертирование хэша в хэш может привести к потерям данных. Поэтому возвращается не хэш, а список пар – а что делать с ним, решает программист.


Вот как делать недеструктивную операцию инвертирования:



my %inverse;
%inverse.push( %original.invert );


Когда пары с уже существующими ключами добавляются в %inverse hash, оригинальное значение не перезаписывается, а превращается в массив.



my %h;
%h.push('foo' => 1); # foo => 1
%h.push('foo' => 2); # foo => [1, 2]
%h.push('foo' => 3); # foo => [1, 2, 3]


Все три указанных оператора по возможности преобразовывают аргументы к тому типу, который они ожидают. Если вы передадите в flip список, он будет превращён в строку, и строка будет реверсирована.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий