Умные сравнения

 
0
 
Perl
ava
alnight | 21.03.2013, 19:40
Здравствуйте.

Простой код:

my @m = (1, 2, 3, 4, 5);
if (@ ~~ 2) { print "2" }
else { print "No 2" }


Вопрос про условие: почему при такой записи (@ ~~ 2) выводит "No 2" (не находит число 2 в массиве), а при (2 ~~ @) находит и выводит "2"?
Kommentare (6)
ava
DurRandir | 21.03.2013, 20:16 #
Потому что smart match некоммутативен.
ava
DProf | 22.03.2013, 11:55 #
Ага, и по-моему это повод не использовать умные сравнения. Чем grep в данной задаче плох?

my @m = (1, 2, 3, 4, 5);
if (grep {$_ == 2} @m) { print "2\n" }
else { print "No 2\n" }
ava
baldina | 22.03.2013, 13:29 #
Цитата (DProf @  22.3.2013,  11:55 findReferencedText)
Чем grep в данной задаче плох?

grep обработает все элементы, smart match остановится после первого совпадения
ava
alnight | 22.03.2013, 13:42 #
grep не плох, просто задача не в том, как лучше написать, а в том, чтобы разобраться в конкретно этой теме.

Я это сравнение взял из книги Шварца "Изучаем перл". Там в главе 15, стр. 268 идет таблица с умными сравнениями. В частности, есть строка: "@a ~~ 123", что объясняется как "содержится хотя бы 1 элемент 123 (в числовом формате)".
А у меня в примере так не работает, когда массив слева, а число справа, поэтому я и создал эту тему. Более того, после таблицы, в конце страницы, написано, что операнды могут следовать в произвольном порядке, это косяк книги? (переводчиков?)

Посмотрел английскую версию книги - там в аналогичной таблице нет ничего про умное сравнение "массив - число" или наоборот.
Кстати, про некоммутативность: в англ версии написано "The order of the operands matters sometimes", что я понимаю как "частично коммутативен, а иногда некоммутативен".

Из этого всего я делаю вывод, что ошибка именно в переводе в русской версии книги, или я где-то что-то не правильно прочитал?
ava
baldina | 22.03.2013, 15:26 #
Цитата


The ~~ operator compares its operands "polymorphically", determining how to compare them according to their actual types (numeric, string, array, hash, etc.) Like the equality operators with which it shares the same precedence, ~~ returns 1 for true and "" for false. It is often best read aloud as "in", "inside of", or "is contained in", because the left operand is often looked for inside the right operand. That makes the order of the operands to the smartmatch operand often opposite that of the regular match operator. In other words, the "smaller" thing is usually placed in the left operand and the larger one in the right.



а при сравнении скаляров коммутативен

http://perldoc.perl.org/perlop.html#Smartmatch-Operator
ava
DurRandir | 23.03.2013, 10:09 #
Цитата
Более того, после таблицы, в конце страницы, написано, что операнды могут следовать в произвольном порядке, это косяк книги? (переводчиков?)


Если книга писалась по перлу 5.10.0, то всё верно. Из perl5120delta:
Цитата
The smart match operator ~~ is no longer commutative. The behaviour of a smart match now depends primarily on the type of its right hand argument. Moreover, its semantics have been adjusted for greater consistency or usefulness in several cases.

Между 5.10 и 5.12 его поведение поменялось. Поэтому лучше всего читать оригинальную документацию на текущий перл)
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden