Je veux diviser un scalaire par des espaces et enregistrer le résultat dans un ArrayReference.
use strict; use warnings; use Data::Dumper; my $name = 'hans georg mustermann'; my $array = split ' ', $name; print Dumper($array); #$VAR1 = 3;
Il semble donc que $ array
soit maintenant un scalaire avec le size
résultant de l'opération split
.
Quand je change le code en my $ array = [split '', $ name]; code> la variable
$ array
est maintenant un ArrayReference et contient les 3 chaînes.
Je ne comprends tout simplement pas ce comportement. Ce serait vraiment génial si quelqu'un pouvait me l'expliquer ou poster une bonne documentation sur ces choses, car je ne sais pas comment rechercher ce sujet.
Merci d'avance
p>
3 Réponses :
Ce que vous voyez ici est appelé "contexte". La documentation à ce sujet est plutôt dispersée. Vous souhaitez également consulter ce tutoriel sur le "contexte scalaire vs liste" https : //perlmaven.com/scalar-and-list-context-in-perl
Si vous affectez le résultat de split (ou de tout appel de sous-programme) à un tableau, c'est le contexte de la liste:
my @arr = split ' ', $name; #=> @arr = ('hans', 'georg', 'mustermann');
Ce que montre votre exemple de code, c'est de les affecter à un scalaire - et donc c'est sous "contexte scalaire".
Puisque, naturellement, plusieurs choses ne peuvent pas entrer dans un position, une sorte de résumé doit être fait. Dans le cas de la fonction split
, perl5 a défini que le nombre d'éléments dans le résultat de split
sera le meilleur.
Consultez la documentation de la fonction split
: https://perldoc.pl/functions/split - qui définit en fait le comportement dans un contexte scalaire ainsi que dans un contexte de liste.
Jetez également un coup d'œil à la documentation de toutes les fonctions intégrées à https://perldoc.pl/functions - vous trouverez la définition du comportement sous "list context" et "scalar context" pour la plupart d'entre eux - bien que beaucoup d'entre eux soient ne renvoyant pas "la taille des listes" mais plutôt autre chose.
Cela s'appelle context a >.
L'expression partielle split '', $ name
s'évalue en une liste. L'expression partielle $ array = LIST
contraint la liste à une valeur scalaire, à savoir le comptage du nombre d'éléments dans la liste. C'est le comportement par défaut des listes dans un contexte scalaire.
Vous devriez écrire @array = LIST
à la place, en utilisant une variable de tableau, et non une variable scalaire, afin de conserver les valeurs de la liste.
Pour être précis, c'est la fonction split
qui compte le nombre d'éléments dans un contexte scalaire, pas les listes elles-mêmes. Les tableaux renvoient également un décompte dans un contexte scalaire, mais l'opérateur virgule, les tranches de liste et l'opérateur qw ne le font pas, par exemple.