/ / Pourquoi avons-nous besoin de deux opérateurs d'égalité (“==” et “eq”) en Perl? [dupliquer] - python, perl, opérateurs

Pourquoi avons-nous besoin de deux opérateurs d'égalité (“==” et “eq”) dans Perl? [duplicate] - python, perl, opérateurs

En Python, je peux utiliser "==" pour comparer des chaînes ou des nombres. Mais en Perl, il y a "==" et "eq". L'utilisation de "==" avec des chaînes peut conduire à des bugs. Pourquoi y a-t-il deux opérateurs? Est-il prudent de toujours utiliser "eq"?

Réponses:

9 pour la réponse № 1

Perl a un système de type différent de Python. En Python, les chaînes et les nombres sont de types différents. Perl n'a que des scalaires.

Pour différencier l'interprétation de chaîne et l'interprétation numérique d'un scalaire, deux ensembles d'opérateurs de comparaison sont utilisés.

Par exemple.

my $x = "foo";
my $y = 0;

$x == $y; # true, but warning
$x eq $y; # false

et

my $x = "1.0";
my $y = 1;

$x == $y; # true
$x eq $y; # false

6 pour la réponse № 2

Quant à la partie "pourquoi" de votre question: Vous avez deux opérateurs différents pour faire deux choses différentes. Si vous n'aviez pas deux opérateurs, vous ne sauriez jamais avec certitude lequel des deux tests vous avez effectué. Comme vous pouvez le voir dans réponse d'Amon ce qui suit est faux:

"1.0" eq "1";

Mais à certaines occasions, vous pouvez vouloir c'est vrai. En d'autres termes, la logique que vous recherchez est la comparaison numérique. A une autre occasion, vous souhaiterez peut-être une comparaison stricte, auquel cas vous ne souhaitez pas que ce qui précède soit vrai.

Etant donné que Perl n'a pas de types de données déclarés, le type de chaque valeur scalaire individuelle dépend du contexte, comme suit:

if ($foo == 0)       # $foo is converted to a number
if ($foo eq "0")     # $foo is converted to a string

Une fonctionnalité de Perl est cette conversion dépendante du contexte, et elle peut conduire à un comportement étrange si elle est mal utilisée, comme ce problème plutôt courant:

if ("foo" == "bar")  # true

Sans les avertissements pragma use warnings allumé, cette déclaration retourne un faux positif sans la moindre trace d'un problème. La raison en est que le contexte généré par l'opérateur d'égalité numérique == transforme les deux chaînes en nombres, et ce nombre est zéro 0. Et bien sur 0 == 0 est vrai. Si l'une des chaînes avait commencé par un nombre, elles auraient été converties en ce nombre.