ProgrammationDéveloppeur Perl/Backend

Comment fonctionnent les contextes en Perl (scalaire, liste et void) ? Donnez des exemples où le choix du contexte influence le comportement du code.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En Perl, il existe des contextes qui influencent le comportement des opérateurs et des fonctions :

  • Scalaire (scalar) — l'expression est évaluée comme une seule valeur.
  • Liste (list) — l'expression est évaluée comme une liste de valeurs.
  • Void — le résultat n'est pas utilisé.

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é

Question piège

Quelle valeur la fonction keys %hash renvoie-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')

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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.