1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ijz-perl6doc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
cn5to6-perlop.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 16:41 a98426f

5to6-perlop: Руководство по операторам Perl 5 и Perl 6

Этот документ призван полностью (надеюсь) перечислить реализацию операторов Perl 5 в Perl 6, а также при необходимости объяснить различия.

  • Примечание: Этот документ не объясняет конкретные детали операторов, а предназначен для того, чтобы помочь разработчикам быстро перейти от привычных методов использования Perl 5 к синтаксису Perl 6.

Для получения подробной информации об операторах Perl 6 обратитесь к документации Perl 6 (раздел «Language operators»).

Приоритет и ассоциативность операторов

В Perl 6 приоритет и ассоциативность операторов значительно отличаются от Perl 5, поэтому здесь они подробно не рассматриваются. Для получения дополнительной информации см. раздел «Operator Precedence».

Терминология и операторы списка

Одноместные или списковые операторы, перечисленные в документации по операторам Perl 5, обычно считаются функциями, такими как print и chdir. Круглые скобки по-прежнему используются для группировки.

Стрелочные операторы

Поскольку возможность разыменования ссылок в Perl 6 встречается нечасто, использование стрелочных операторов для разыменования также ограничено. Вместо этого для разыменования объектов используется точка. Кроме того, вызов метода объекта также выполняется с помощью точки. Таким образом, в Perl 6 оператор $arrayref->[7] заменяется на $arrayref.[7], а $user->name — на $user.name. Толстая стрелка => теперь используется для создания пар, подробнее см. в разделе «Pair term documentation».

Операторы инкремента и декремента

Могут использоваться так же, как и в Perl 5. Однако следует отметить, что в Perl 6 можно использовать методы succ и pred для реализации ++ и -- соответственно. Непосредственное использование ++ и -- может привести к непредсказуемым результатам при применении к встроенным числовым типам. Однако пользовательские типы также могут определять методы succ и pred. Поэтому в этих случаях необходимо обращать внимание на то, что на самом деле делают ++ и --.

Возведение в степень

Работает ожидаемым образом по сравнению с оператором ** в Perl 5. В Perl 6 его приоритет выше, чем у одноместных операторов (например, значение -24 равно -(24), а не (-2)**4).

Одноместные символьные операторы

В Perl 5 одноместные операторы ! и - являются логическим отрицанием и арифметическим отрицательным знаком соответственно и могут потребовать внимания, поскольку они преобразуют свои аргументы в Bool и Numeric соответственно. ?^ используется как побитовое отрицание, некоторые документы описывают эту операцию как !.

В Perl 6 одноместный оператор ~ является оператором конкатенации строк, вы можете использовать +^ для выполнения побитового отрицания, который является бинарным оператором.

  • в Perl 6 влияет на операнды, он преобразует их в числовые типы.

Символ \ был удалён, если вам действительно нужно сослаться на существующую именованную переменную, вы можете использовать контекст элемента, например, $aref = item(@array), или получить ссылку на именованный подпрограмму с помощью & sigil: $sref = &foo. Анонимные массивы, хэши и подпрограммы возвращают свои ссылки при создании.

Связывающие операторы

=~ и !~ были заменены на ~~ и !~~, которые теперь более полезны благодаря строгой типизации. Те, кто беспокоился о интеллектуальном сопоставлении в Perl 5, теперь могут быть спокойны.

Умножение, деление и остаток

Бинарные операторы * , / и % в Perl 5 представляют умножение, деление и взятие остатка соответственно.

Бинарный оператор x в Perl 6 немного отличается, аналогичное выражение print '-' x 80; вернёт строку из 80 дефисов (что аналогично), но в Perl 6 аналогичный эффект достигается с использованием @ones = 1 xx 80;.

Сложение и вычитание

Бинарные операторы + и - представляют сложение и вычитание соответственно, как и ожидалось.

Поскольку . теперь является оператором вызова метода, бинарный оператор ~ заменяет . в качестве оператора конкатенации в Perl 6.

Побитовые операторы

C << и C >> заменяются на +< и +>.

Одноместные именованные операторы

Как упоминалось ранее, см. 5to6-perlfunc.pod6.

Реляционные операторы

Работают так же, как в Perl 5.

Сравнительные операторы

Операторы == и != работают так же, как в Perl 5.

Оператор <=> и cmp ведут себя совершенно по-разному в Perl 6. <=> действует как оператор сравнения чисел, но возвращает не -1, 0 или 1, а Order::Less, Order::Same или Order::More. Чтобы получить поведение, подобное в Perl 5 (Perl 6 также возвращает объект Order, а не целое число), вы должны использовать leg operator.

cmp теперь может выполнять <=> или leg в зависимости от типа аргумента (в соответствии с обоими типами).

~~ — это оператор интеллектуального сопоставления в Perl 5, который, как упоминалось ранее, стал оператором регулярного сопоставления в Perl 6. Для получения подробной информации о операторе интеллектуального сопоставления в Perl 6 см. https://design.perl6.org/S03.html#Smart_matching.

Оператор интеллектуального сопоставления

См. непосредственно ~~.

Логическое И

& заменяется на +&.

Логические ИЛИ и исключающее ИЛИ

Побитовое ИЛИ из Perl 5 становится +| в Perl 6, аналогично, исключающее ИЛИ ^ заменяется на +^.

C-стиль логическое И

Без изменений.

C-стиль логическое ИЛИ

Без изменений.

Определение логического ИЛИ

Perl 6 по-прежнему использует //, если первый операнд определён, он возвращается, иначе возвращается второй операнд. Конечно, у него также есть версия с низким приоритетом orelse.

Диапазон операторов

На списковом контексте C.. остаётся оператором диапазона без изменений, и добавляются некоторые полезные операторы диапазона:

  • infix ..^ не включает конечную точку;
  • infix ^.. не включает начальную точку;
  • infix ^..^ не включает ни начальную, ни конечную точки;
  • prefix ^ начинается с 0 и не включает конечную точку.

Следующий пример показывает различные операции, выполняемые этими операторами (обратите внимание, что круглые скобки используются только для разрешения вызовов методов):

(1..^5).list;  # (1 2 3 4)
(1^..5).list;  # (2 3 4 5)
(1^..^5).list; # (2 3 4)
(^5).list;     # (0 1 2 3 4)

В контексте скаляра Perl 5 C.. и C... действуют как операторы flip-flop, но они малоизвестны и редко используются. Эти операторы заменяются L<ff|/routine/ff> и L<fff|/routine/fff> в Perl 6.

Условный оператор

?: заменяется на ?? !!, например, код Perl 5 $x = $ok ? $y : $z; в Perl 6 должен выглядеть следующим образом: $x = $ok ?? $y !! $z;.

Присваивание

Хотя оно ещё не полностью задокументировано, S03 указывает, что числовое и логическое присваивание будет вести себя ожидаемо. Очевидным изменением является то, что .= вызовет метод мутации объекта слева от знака равенства. А ~= — это присваивание конкатенации. Как и ожидалось, . и ~ меняются аналогичным образом. Также кажется, что побитовое присваивание больше не различает числовые и строковые версии (&= и т. д. против .&= и т. д.), хотя эти функции всё ещё экспериментальны в Perl 5 и пока не имеют точной документации.

Запятая

Запятая ведёт себя ожидаемым образом, но технически она используется для создания списков или разделения аргументов функций, и функции также могут использовать : для преобразования вызова функции в вызов метода объекта, см. эту страницу.

Оператор => похож на «жирную стрелку» в Perl 5, он позволяет использовать левую метку без ссылки, но в Perl 6 он используется для построения объектов Pair, а не просто как разделитель. Если вы конвертируете код из Perl 5 в Perl 6, его поведение не изменится.

Список операторов

Аналогично одноместным именованным операторам, см. 5to6-perlfunc.pod.

Логическое НЕ

Версия с низким приоритетом логического оператора !, она принуждает свой аргумент к Bool.

Логическое И

Версия с низким приоритетом &&, ведёт себя так же, как в Perl 5.

Логическое ИЛИ и исключающее ИЛИ

or — версия с низким приоритетом ||. Документация также упоминает xor, но без подробной документации.

Кроме того, существует версия orelse с низким приоритетом оператора //. В Perl 5, одинарные кавычки ведут себя аналогично.

qq позволяет подстановку переменных, но по умолчанию только скаляры будут заменены. Для других типов переменных необходимо добавить квадратные скобки после них. Например:

@a =<1 2 3>;say qq/@a[] example@example.com/;

Результат будет «1 2 3 example@example.com».

Для хэшей подстановка результатов происходит неожиданным образом:

%a = 1 => 2, 3 => 4;say "%a[]";

Результаты будут разделены пробелами для пар ключ-значение, а ключи и значения каждой пары будут разделены табуляцией (явно).

Конечно, вы всё ещё можете использовать фигурные скобки для вставки кода Perl 6 в строку. Подробности смотрите в разделе «Интерполяция» (#language-quoting-interpolation-3a_qq).

qw ведёт себя так же, как и в Perl 5. Он также может быть представлен в форме <...>, например qw/a b c/ и <a b c> эквивалентны.

Существует версия qw, поддерживающая подстановку (qqw), например:

my $a = 42;say qqw/$a b c/;

Вернёт «42 b c».

Теперь для ссылок на shell используется qx, но следует отметить, что ``` не используется для ссылок на shell, как в Perl 5. Также переменные Perl не интерполируются в строках qx. Если вы хотите использовать подстановку в строке команды shell, вам нужно использовать `qqx`.

qr был удалён.

tr/// похож на Perl 5, но способ указания диапазона изменился. Теперь нужно использовать «a..z», а не «a-z». Соответствующий метод объекта имеет подробную документацию, это .trans, объект которого представляет собой список пар: например, $x.trans(['a'..'c'] => ['A'..'C'], ['d'..'q'] => ['D'..'Q'], ['r'..'z'] => ['R'..'Z']);. Подробные сведения о .trans см. на странице https://design.perl6.org/S05.html#Transliteration. Эквивалент y/// был удалён.

Heredoc в Perl 6 имеет некоторые отличия. Вы должны использовать :to в качестве оператора ссылки, например:

q:to/END/; начнёт heredoc, который заканчивается на «END». Аналогично, в зависимости от используемого вами оператора ссылки Q, q или qq, heredoc будет вести себя соответствующим образом.

I/O операции

Полные детали ввода/вывода в Perl 6 см. в разделе «Язык программирования» (io).

<...> используется как конструктор quote-word в Perl 6, <> больше не используется для чтения файлов построчно. Вы можете реализовать это, вызывая метод .lines для объекта IO или открытого дескриптора файла. Например:

my @a ="filename".IO.lines; или my $fh = open "filename", :r;my @a =$fh.lines; (последний использует :r, чтобы указать, что файл открыт в режиме только для чтения). Для итеративного подхода можно использовать цикл for:

for 'huge-csv'.IO.lines -> $line {
    # Do something with $line
}

Обратите внимание на использование ->, которое является частью синтаксиса структурного блока. В Perl 6 if, for, while и т. д. требуют структурный блок.

Если вы хотите прочитать весь файл в скалярную переменную, вы можете использовать метод .slurp. Например:

my $x = "filename".IO.slurp;
# ... или ...
my $fh = open "filename", :r;
my $x = $fh.slurp;

В 5to6-perlvar.pod упоминается, что волшебный дескриптор файла ввода ARGV был заменён на $*ARGFILES, а массив аргументов командной строки @ARGV — на @*ARGS.

Пустые операции

Хотя в документации это не упоминается особо, 1 while foo(); работает нормально.

Побитовые строковые операторы

Подводя итог ранее упомянутому:

Префиксный оператор +^ выполняет побитовое отрицание целого числа, а ?^ — побитовое отрицание булева типа.

Побитовое и — это +&.

Целочисленное побитовое или — это +|, побитовое исключающее или для среднего уровня — это префиксный оператор +^, а побитовое или для булевого типа — это ?|.

Сдвиг влево и вправо осуществляется с помощью +< и +> соответственно.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/ijz-perl6doc.git
git@api.gitlife.ru:oschina-mirror/ijz-perl6doc.git
oschina-mirror
ijz-perl6doc
ijz-perl6doc
master