В чем дело со всеми различными операторами равенства Perl 6? (==, ===, уравнение, уравнение, ~~, =: =,)

Кажется, что в Perl 6 появилось множество операторов равенства. Что такое =:=? В чем разница между leg и cmp? Или eqv и ===?

У кого-нибудь есть хорошее резюме?


person raldi    schedule 06.10.2008    source источник
comment
Знаете ли вы, что ... также является допустимым оператором?   -  person Brad Gilbert    schedule 18.10.2008
comment
Почему есть страх перед сложностями? Вам не нужно использовать все функции. Просто узнайте, что вам нужно.   -  person Aftershock    schedule 19.12.2012


Ответы (4)


=: = проверяет наличие двух контейнеров (переменных или элементов массивов или хешей) имеют псевдонимы, т.е. если одно изменяется, изменяется ли другое?

my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3 

Что касается остальных: === проверяет, указывают ли две ссылки на одно и то же. объект, а eqv проверяет, эквивалентны ли две вещи структурно. Таким образом, [1, 2, 3] === [1, 2, 3] будет ложным (не тот же массив), но [1, 2, 3] eqv [1, 2, 3] будет истинным (та же структура).

leg сравнивает строки, такие как cmp в Perl 5, в то время как cmp в Perl 6 умнее и сравнивает числа, такие как <=>, и строки, такие как leg.

13 leg 4   # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4   # +1, because both are numbers, so use numeric comparison.

Наконец, ~~ - это «умное совпадение», оно отвечает на вопрос «совпадает ли $x с $y». Если $y является типом, это проверка типа. Если $y является регулярным выражением, это совпадение с регулярным выражением и т. Д.

person moritz    schedule 06.10.2008
comment
В Perl 5 нет «eqv». Я думаю, вы имели в виду "cmp". - person cjm; 07.10.2008

Из Reddit сегодня:

Сравнение операторов равенства Perl

person Randy    schedule 06.10.2008
comment
Спасибо, но я до сих пор не понимаю, что делает =: =. А в чем разница между leg и cmp? - person raldi; 07.10.2008
comment
Насколько мне известно, =: = имеет значение только в том случае, если вы назначили псевдонимы. Согласно perlgeek.de/blog-en/perl-5-to-6 cmp был переименован в leg, поэтому они должны быть такими же. - person Randy; 07.10.2008
comment
Это не то же самое (и я надеюсь, что я не сказал этого в том блоге), cmp умнее, чем leg. - person moritz; 07.10.2008
comment
Спасибо за разъяснения, moritz (и за то, что написали эту статью!) Там сказано, что cmp теперь называется leg в разделе сопоставления, так что вы можете добавить объяснение, которое вы включили в свой пост, здесь, в своем блоге. - person Randy; 07.10.2008

Делает ли сводка в Синопсис 3: Семантика сравнения то, что вы хотите, или вы уже читали что? В документации по дизайну есть ссылки на тестовые файлы, в которых используются эти функции, поэтому вы можете увидеть примеры их использования и их текущее состояние тестирования.

Операторы сравнения Perl 6 гораздо больше подходят для динамического языка и всего происходящего. Вместо того, чтобы просто сравнивать строки или числа (или превращать их в строки или числа), теперь вы можете точно тестировать вещи с помощью оператора, который делает то, что вы хотите. Вы можете проверить значение, контейнер, тип и так далее.

В одном из комментариев вы спрашиваете про eqv и cmp. В старые времена Perl 5 cmp использовался для сортировки и возвращал одно из трех магических значений (-1,0,1), и он всегда делал это со строковой семантикой. В Perl 6 cmp возвращает один из трех типов объектов Order, поэтому вам не нужно помнить, что означает -1, 0 или 1. Кроме того, новый cmp не требует семантики строк, поэтому он может быть умнее при передаче чисел (в отличие от Perl 5, который сортирует как 1, 10, 11, 2, 20, 21 ...).

leg (l ess than, e qual, g reater than) - это cmp со строковой семантикой. Он определен как ~$a cmp ~$b в Perl 6, где ~ - это новый «строковый контекстуализатор», который форсирует строковую семантику. С leg вы всегда выполняете сравнение строк, как и в старом Perl 5 cmp.

Если у вас остались вопросы по другим операторам, давайте разберем их на отдельные вопросы. :)

person brian d foy    schedule 07.10.2008

Это также удобный справочник:

Периодическая таблица операторов Perl6

person Community    schedule 14.04.2010
comment
Этот отпечаток хоть и прекрасен, но не соответствует текущей версии спецификации Perl 6.c. - person Coke; 22.01.2016
comment
@Coke ну, это было написано еще в 2010 году, но ответчик по-прежнему является активным пользователем, поэтому я бы хотел, чтобы они его обновили - person cat; 03.03.2016
comment
@tac ответ помечен как «вики сообщества», так что любой может его редактировать. Или вы можете уточнить в комментарии, какое обновление вы ожидаете. - person Ether; 04.03.2016
comment
@Ether Я в основном отвечал на кока-колу; Я не жду такого обновления - person cat; 04.03.2016
comment
Периодическая таблица операторов была составлена ​​волонтером, который, насколько мне известно, некоторое время не работал. Я рекомендую использовать docs.perl6.org для реальных справочных вопросов. - person Coke; 07.03.2016