У Python я можу використовувати "==" для порівняння рядків або чисел. Але в Perl є "==" і "eq". Використання "==" з рядками може призвести до помилок. Чому існують два оператори? Чи безпечно завжди використовувати "eq"?
Відповіді:
9 для відповіді № 1Perl має іншу систему типу, ніж Python. У Python, Strings and Numbers є різними типами. Perl має тільки скаляри.
Щоб розрізняти інтерпретацію рядків і числову інтерпретацію скаляру, використовуються два набори операторів порівняння.
Наприклад,
my $x = "foo";
my $y = 0;
$x == $y; # true, but warning
$x eq $y; # false
і
my $x = "1.0";
my $y = 1;
$x == $y; # true
$x eq $y; # false
6 для відповіді № 2
Що стосується "чому" частини вашого запитання: У вас є два різних оператора, щоб зробити дві різні речі. Якщо у вас не було двох операторів, ви ніколи б не знали напевно, який з двох тестів ви зробили. Як ви можете бачити відповідь амона таке:
"1.0" eq "1";
Але в деяких випадках ви можете хочеш це правда. Іншими словами, логіка, за якою ви йдете, - це чисельне порівняння. З іншого боку, ви, можливо, захочете порівнювати по строках, і в цьому випадку ви не хочете, щоб вище було правдою.
Оскільки Perl не має явних типів даних, тип кожного окремого скалярного значення залежить від контексту, наприклад:
if ($foo == 0) # $foo is converted to a number
if ($foo eq "0") # $foo is converted to a string
Особливістю Perl є перетворення, залежне від контексту, і це може призвести до дивної поведінки, коли використовується неправильно, наприклад, ця досить поширена проблема:
if ("foo" == "bar") # true
Без попереджень прагма use warnings
Увімкнуто, ця операція повертає помилковий позитив без натяку на проблему. Причина полягає в тому, що контекст, згенерований числовим оператором рівності ==
перетворює обидві рядки в числа, і це число дорівнює нулю 0
. І звичайно, 0 == 0
правда. Якщо б будь-який з рядків почався з числа, вони були б замінені на це число.