Perl est un langage avec une dépendance contextuelle marquée : le résultat d'une expression dépend de la manière dont son résultat est utilisé. Historiquement, cela a rendu le langage extrêmement flexible, mais même les développeurs expérimentés peuvent se tromper s'ils ne tiennent pas compte des particularités du contexte scalaire et du contexte de liste.
La question a émergé dès les premières versions de Perl, lorsque l'on supposait qu'une même opération pouvait retourner un tableau ou une valeur unique - par exemple, l'appel de la fonction localtime peut retourner soit une liste, soit une chaîne en fonction de la situation.
Le problème réside dans le fait qu'un traitement incorrect du contexte peut entraîner des erreurs inattendues : par exemple, des éléments supplémentaires, des résultats vides ou un comportement étrange des expressions logiques.
La solution consiste à toujours comprendre explicitement dans quel contexte une fonction ou une expression est appelée, à utiliser la fonction intégrée wantarray dans ses sous-programmes et à ne pas permettre un mélange implicite des contextes.
Exemple de code :
sub may_return { return wantarray ? (1, 2, 3) : "résultat scalaire"; } my @arr = may_return(); # retournera (1,2,3) my $val = may_return(); # retournera "résultat scalaire"
Caractéristiques clés :
Peut-on déterminer si une expression est utilisée dans un contexte void, dans la fonction elle-même ?
Réponse : Non, seulement scalaire ou de liste. Dans Perl 5, il n'existe pas de fonction déterminant le contexte void à l'intérieur d'un sous-programme — la fonction wantarray retourne undef dans ce cas, mais pour un autre comportement.
Exemple de code :
sub example { return wantarray ? (1,2) : wantarray ? undef : "scalaire"; # incorrect }
Une fonction peut-elle retourner différents types de données selon le contexte ?
Réponse : Oui, c'est tout à fait acceptable et souvent utilisé.
Le comportement des opérateurs (par exemple, shift, pop) dépend-il du contexte ?
Réponse : Oui. Par exemple, lorsque shift est appelé à l'intérieur d'une fonction, cela dépend si @_ (de manière globale ou lexicale) est utilisé, et si le résultat sera transmis comme scalaire ou comme liste.
Un développeur a écrit une fonction qui retourne toujours une liste, sans tenir compte du contexte scalaire. Si cette fonction est appelée dans un contexte scalaire, seul le dernier élément de la liste sera obtenu.
Avantages :
Inconvénients :
La fonction utilise wantarray et retourne soit une liste, soit un scalaire significatif ou undef.
Avantages :
Inconvénients :