ProgrammatiePerl-programmeur/Backend ontwikkelaar

Hoe werken contexten in Perl (scalair, lijst en void)? Geef voorbeelden waar de keuze van context het gedrag van de code beïnvloedt.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl zijn er contexten, die het gedrag van operators en functies beïnvloeden:

  • Scalair (scalar) — de expressie wordt berekend als één waarde.
  • Lijsts (list) — de expressie wordt berekend als een lijst van waarden.
  • Void — het resultaat wordt niet gebruikt.

Functies en operators kunnen verschillende resultaten retourneren, afhankelijk van de context.

Voorbeelden:

my @arr = (1, 2, 3); my $count = @arr; # scalair context: $count = 3 my @copy = @arr; # lijst context: de hele array wordt gekopieerd my $line = <STDIN>; # leest één regel (scalair) my @lines = <STDIN>; # leest alle regels (lijst)

De context kan expliciet ingesteld worden via de functie scalar():

my $last_idx = scalar @arr; # dwingt scalair context af

Vraag met een valstrik

Welke waarde retourneert de functie keys %hash in scalair context?

Antwoord: Het retourneert het aantal elementen in de hash, en geen lijst van sleutels zoals in de lijst context.

my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')

Voorbeelden van echte fouten door onwetendheid over de subtiliteiten van het onderwerp


Verhaal

In een project telden ze het aantal elementen in een array:

my @items = get_items(); my $cnt = @items;

Later besloot iemand om $cnt = get_items(); toe te wijzen, niet beseffend dat de functie een lijst retourneert — nu kreeg men altijd slechts één (het eerste) retourwaarde, en niet het aantal elementen.


Verhaal

Bij het lezen van regels uit een bestand:

my $lines = <FILE>;

In de verwachting het hele bestand te krijgen, kreeg men alleen de eerste regel — men hield geen rekening met het feit dat er in scalair context slechts één regel wordt geretourneerd.


Verhaal

De ontwikkelaar riep een functie aan in void-context, zonder de verkregen waarde te gebruiken:

open_my_file(); # functie retourneert een descriptor, maar deze werd niet opgeslagen

Dit maakte het debuggen moeilijker — de functie werkte, maar het bestand werd nergens opgeslagen, en fouten werden niet opgemerkt.