Приоритеты умного сравнения

Итак, вы видите, что оператор умного сравнения экономит немало времени и усилий. Остается узнать, какие сравнения выполняются в тех или иных ситуациях. Для этого необходимо обратиться к таблице из раздела «Smart matching in detail» документации perlsyn. Встретив оператор умного сравнения, Perl переходит в начало таблицы и начинает искать тип, соответствующий двум операндам. Сравнение осуществляется по первому найденному типу. Операнды могут следовать в произвольном порядке. Допустим, в операндах передается массив и хеш:

use 5.010;
if( @array ~~ %hash ) { ... }

Perl находит для хеша и массива сравнение, которое проверяет, что хотя бы один из элементов @array является ключом в %hash. Здесь все просто, потому что для этих двух операндов возможен только один тип сравнения. А если указаны два скаляра?

use 5.010;
if( $fred ~~ $barney ) { ... }

Пока невозможно сказать, какое сравнение будет выполнено; чтобы выбрать тип сравнения, необходимо заглянуть в содержимое этих двух скалярных переменных. Perl не может принять решения без анализа данных, содержащихся в этих переменных. В каком виде сравнивать переменные – в числовом или в строковом? Чтобы определить, как следует сравнивать $fred и $barney, Perl проверяет значения по уже изложенным правилам.


Он перебирает строки таблицы от начала к концу, пока не найдет подходящее описание, а затем использует соответствующую операцию. При этом необходимо учитывать одну тонкость: Perl распознает некоторые строки как числа (так называемые «числовые строки» – numish strings). Речь идет о строках вида '123', '3.14149' и т. д. Содержимое этих строк заключено в апострофы, поэтому они фактически являются последовательностями символов, однако Perl может преобразовать их в числа без предупреждений. Если Perl обнаруживает в обеих частях оператора умного сравнения числа или числовые строки, он выполняет числовое сравнение. В противном случае выполняется строковое сравнение.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Команда given
Обычное сравнение
Оператор умного сравнения
Условия when с несколькими элементами

Вернуться в раздел: Perl / 14. Умные сравнения и given)when