Perl is een taal met uitgesproken contextgevoeligheid: het resultaat van een uitdrukking hangt af van hoe het resultaat wordt gebruikt. Historisch gezien heeft dit de taal buitengewoon flexibel gemaakt, maar zelfs ervaren ontwikkelaars kunnen fouten maken als ze de nuances van schalare en lijstcontext niet in overweging nemen.
De vraag ontstond met de eerste versies van Perl, toen werd aangenomen dat dezelfde operatie een array of een enkel waarde kan opleveren — bijvoorbeeld kan de aanroep van de functie localtime ofwel een lijst of een string teruggeven afhankelijk van de situatie.
Probleem is dat onjuiste behandeling van context leidt tot onverwachte fouten: bijvoorbeeld, overbodige elementen, lege resultaten of vreemde gedragingen van logische uitdrukkingen.
Oplossing — altijd expliciet begrijpen in welke context een functie of uitdrukking wordt aangeroepen, gebruik de ingebouwde functie wantarray in je subroutines en vermijd impliciete menging van contexten.
Voorbeeldcode:
sub may_return { return wantarray ? (1, 2, 3) : "scalar result"; } my @arr = may_return(); # geeft (1,2,3) terug my $val = may_return(); # geeft "scalar result" terug
Belangrijkste kenmerken:
Kan een uitdrukking in void-context worden gedefinieerd binnen de functie zelf?
Antwoord: Nee, alleen schalaar of lijst. In Perl 5 is er geen functie die void-context binnen een subroutine kan definiëren — de functie wantarray retourneert undef in dit geval, maar voor ander gedrag.
Voorbeeldcode:
sub example { return wantarray ? (1,2) : wantarray ? undef : "scalar"; # onjuist }
Kan een functie verschillende gegevenstypen teruggeven afhankelijk van de context?
Antwoord: Ja, het is volledig acceptabel en wordt vaak gebruikt.
Hangt het gedrag van operators (bijv. shift, pop) af van de context?
Antwoord: Ja. Bijvoorbeeld, wanneer shift binnen een functie wordt aangeroepen — het hangt af of @_ (globaal of lexicaal) wordt gebruikt, en of het resultaat als schalaar of als lijst wordt doorgegeven.
De ontwikkelaar schreef een functie die altijd een lijst teruggeeft, zonder rekening te houden met de schalare context. Als deze functie in een schalare context wordt aangeroepen, krijg je alleen het laatste element van de lijst.
Voordelen:
Nadelen:
De functie gebruikt wantarray en geeft ofwel een lijst of een betekenisvolle schalaar of undef terug.
Voordelen:
Nadelen: