Кажется, что в Perl 6 появилось множество операторов равенства. Что такое =:=
? В чем разница между leg
и cmp
? Или eqv
и ===
?
У кого-нибудь есть хорошее резюме?
Кажется, что в Perl 6 появилось множество операторов равенства. Что такое =:=
? В чем разница между leg
и cmp
? Или eqv
и ===
?
У кого-нибудь есть хорошее резюме?
=: = проверяет наличие двух контейнеров (переменных или элементов массивов или хешей) имеют псевдонимы, т.е. если одно изменяется, изменяется ли другое?
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
является регулярным выражением, это совпадение с регулярным выражением и т. Д.
Из Reddit сегодня:
Сравнение операторов равенства Perl
Делает ли сводка в Синопсис 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
.
Если у вас остались вопросы по другим операторам, давайте разберем их на отдельные вопросы. :)
Это также удобный справочник:
Периодическая таблица операторов Perl6
...
также является допустимым оператором? - person Brad Gilbert   schedule 18.10.2008