In Perl zijn er contexten, die het gedrag van operators en functies beïnvloeden:
scalar) — de expressie wordt berekend als één waarde.list) — de expressie wordt berekend als een lijst van waarden.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
Welke waarde retourneert de functie
keys %hashin 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')
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 opgeslagenDit maakte het debuggen moeilijker — de functie werkte, maar het bestand werd nergens opgeslagen, en fouten werden niet opgemerkt.