En Perl, il existe des contextes qui influencent le comportement des opérateurs et des fonctions :
scalar) — l'expression est évaluée comme une seule valeur.list) — l'expression est évaluée comme une liste de valeurs.Les fonctions et les opérateurs peuvent retourner des résultats différents en fonction du contexte.
Exemples :
my @arr = (1, 2, 3); my $count = @arr; # contexte scalaire : $count = 3 my @copy = @arr; # contexte liste : tout le tableau est copié my $line = <STDIN>; # lit une ligne (scalaire) my @lines = <STDIN>; # lit toutes les lignes (liste)
Le contexte peut être défini explicitement via la fonction scalar() :
my $last_idx = scalar @arr; # contexte scalaire forcé
Quelle valeur la fonction
keys %hashrenvoie-t-elle en contexte scalaire ?
Réponse : Renvoie le nombre d'éléments dans le hash, et non la liste des clés comme en contexte liste.
my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')
Histoire
Dans un projet, on comptait le nombre d'éléments d'un tableau :
my @items = get_items(); my $cnt = @items;Plus tard, quelqu'un a décidé d'assigner
$cnt = get_items();, ne comprenant pas que la fonction retourne une liste — maintenant, on obtenait toujours une seule (première) valeur retournée, et non le nombre d'éléments.
Histoire
Lors de la lecture de lignes d'un fichier :
my $lines = <FILE>;S'attendant à obtenir tout le fichier, on a obtenu seulement la première ligne — on n'a pas pris en compte que le contexte scalaire renvoie une seule ligne.
Histoire
Un développeur a appelé une fonction dans un contexte void, sans utiliser la valeur renvoyée :
open_my_file(); # la fonction renvoie un descripteur, mais il n'est pas sauvegardéCela a compliqué le débogage — la fonction fonctionnait, mais le fichier n'était nulle part sauvegardé, et les erreurs n'étaient pas attrapées.