5to6-perlop: Руководство по операторам 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 одноместный оператор ~ является оператором конкатенации строк, вы можете использовать +^ для выполнения побитового отрицания, который является бинарным оператором.
Символ \ был удалён, если вам действительно нужно сослаться на существующую именованную переменную, вы можете использовать контекст элемента, например, $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.. остаётся оператором диапазона без изменений, и добавляются некоторые полезные операторы диапазона:
Следующий пример показывает различные операции, выполняемые этими операторами (обратите внимание, что круглые скобки используются только для разрешения вызовов методов):
(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 будет вести себя соответствующим образом.
Полные детали ввода/вывода в 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 )