/ / Чому в Perl потрібні два оператори рівності ("==" і "eq")? [дублювати] - python, perl, оператори

Чому нам потрібні два оператори рівності ("==" і "eq") у Perl? [дублікат] - python, perl, оператори

У Python я можу використовувати "==" для порівняння рядків або чисел. Але в Perl є "==" і "eq". Використання "==" з рядками може призвести до помилок. Чому існують два оператори? Чи безпечно завжди використовувати "eq"?

Відповіді:

9 для відповіді № 1

Perl має іншу систему типу, ніж 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 правда. Якщо б будь-який з рядків почався з числа, вони були б замінені на це число.