В Perl раздельно реализованы арифметические и строковые операторы. Например, +, -, *, / используются для математических операций, а . (точка) — для конкатенации строк. Perl динамически приводит типы: если хотя бы один операнд в числовом контексте, строка будет автоматически преобразована в число (например, '42foo' станет 42). Это может привести к неожиданным результатам при неявном приведении типов.
Пример:
my $a = "3"; my $b = "4 apples"; my $c = $a + $b; # $c = 7 my $d = $a . $b; # $d = '34 apples'
Также различаются операторы сравнения:
==, !=, >, <)eq, ne, gt, lt)Чем отличаются операторы == и eq в Perl и что произойдет, если сравнивать строковые значения с помощью ==?
Ответ и пример:
== выполняет числовое сравнение, неявно переводя строки в числа, а eq — строковое. Ошибкой будет использование == для строк:
my $x = "foo"; my $y = "foo"; print $x == $y ? "equal" : "not equal"; # Выведет 'not equal' и предупредит о некорректном преобразовании
История 1: В проекте по обработке логов сравнивали строки с помощью
==вместоeq, что приводило к пропуску нужных записей. Логика фильтрации была сломана, а баг долго не могли найти из-за отсутствия ошибок выполнения.
История 2: При конкатенации числовых значений встречали неожиданные пробелы или потерю данных из-за неверного использования оператора
.вместо+, и наоборот. Это привело к некорректному формированию ключей кэширования, в результате чего кэш работал неправильно.
История 3: Автоматическое приведение строки с лишними символами, например
'100abc', к числу 100 приводило к парадоксальным ошибкам при расчетах скидок в e-commerce проекте — часть скидок вычислялась неправильно из-за некорректных входных данных.