Les conversions implicites sont tout à fait possibles. La situation où vous rencontrez des problèmes est lorsque vous ne savez pas de quelle manière quelque chose devrait fonctionner.
Un exemple de cela peut être vu en Javascript où l' +
opérateur travaille de différentes manières à différents moments.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Si l'un des arguments est une chaîne, alors l' +
opérateur est une concaténation de chaîne, sinon c'est l'addition.
Si on vous donne un argument et que vous ne savez pas s'il s'agit d'une chaîne ou d'un entier, et que vous souhaitez en ajouter, cela peut être un peu compliqué.
Une autre façon de gérer cela est de l'héritage de base (que perl suit - voir Programmation est difficile, allons-y Scripting ... )
Dans Basic, la len
fonction n'a de sens que d'être invoquée sur une chaîne (docs pour Visual Basic : "Toute expression de chaîne valide ou nom de variable. Si l'expression est de type Object, la fonction Len renvoie la taille telle qu'elle sera écrite dans le fichier par la fonction FilePut. ").
Perl suit ce concept de contexte. La confusion qui existe en JavaScript avec la conversion implicite des types pour l' +
opérateur étant parfois plus et parfois concaténation ne se fait pas en Perl car +
est toujours plus et .
est toujours concaténation.
Si quelque chose est utilisé dans un contexte scalaire, c'est un scalaire (par exemple, en utilisant une liste comme scalaire, la liste se comporte comme s'il s'agissait d'un nombre correspondant à sa longueur). Si vous utilisez un opérateur de chaîne ( eq
pour le test d'égalité, cmp
pour la comparaison de chaînes), le scalaire est utilisé comme s'il s'agissait d'une chaîne. De même, si quelque chose a été utilisé dans un contexte mathématique ( ==
pour le test d'égalité et <=>
pour la comparaison numérique), le scalaire est utilisé comme s'il s'agissait d'un nombre.
La règle fondamentale pour toute programmation est "faire ce qui surprend le moins". Cela ne veut pas dire qu'il n'y a pas de surprise là-dedans, mais l'effort est de surprendre le moins la personne.
En allant chez un proche cousin de perl-php, il y a des situations où un opérateur peut agir sur quelque chose dans des contextes de chaîne ou numériques et le comportement peut surprendre les gens. L' ++
opérateur en est un exemple. Sur les chiffres, il se comporte exactement comme prévu. Lorsque vous agissez sur une chaîne, par exemple "aa"
, il incrémente la chaîne ( $foo = "aa"; $foo++; echo $foo;
imprime ab
). Il roulera également de sorte que az
lorsqu'il sera incrémenté ba
. Ce n'est pas encore particulièrement surprenant.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Cela imprime:
3d8
3d9
3e0
4
Bienvenue aux dangers des conversions implicites et des opérateurs agissant différemment sur la même chaîne. (Perl gère ce bloc de code un peu différemment - il décide que "3d8"
lorsque l' ++
opérateur est appliqué est une valeur numérique dès le début et passe 4
immédiatement ( idéone ) - ce comportement est bien décrit dans perlop: incrémentation automatique et décrémentation automatique )
Maintenant, pourquoi une langue fait quelque chose d'une manière et une autre le fait d'une autre manière, cela revient aux pensées de conception des designers. La philosophie de Perl est qu'il y a plus d'une façon de le faire - et je peux penser à un certain nombre de façons de faire certaines de ces opérations. D'un autre côté, Python a une philosophie décrite dans PEP 20 - Le Zen de Python qui stipule (entre autres): "Il devrait y avoir une - et de préférence une seule - manière évidente de le faire."
Ces différences de conception ont conduit à différentes langues. Il existe un moyen d'obtenir la longueur d'un nombre en Python. La conversion implicite va à l'encontre de cette philosophie.
Lecture connexe: Pourquoi Ruby n'a-t-il pas une conversion implicite de Fixnum en chaîne?
perl -e 'print length(100);'
imprime 3.