In Perl zijn eenvoudige datastructuren scalars, arrays en hashes, die we rechtstreeks via hun naam benaderen. Referenties zijn scalars die het adres van andere datastructuren bevatten. Ze zijn nodig om geneste (meer-dimensionale) arrays, geneste hashes en complexe objecten te creëren.
Voorbeeld van het gebruik van referenties:
my %hash = ( foo => 1, bar => 2 ); my $ref = \%hash; print $ref->{foo}; # 1 # Array van hashes my @array = ( { name => "Tom" }, { name => "Jerry" } ); print $array[1]{name}; # Jerry
Als referenties niet worden gebruikt, is het bijvoorbeeld niet mogelijk om een meer-dimensionale array te creëren:
# Meer-dimensionale array via referenties my $matrix = [ [1,2,3], [4,5,6] ]; print $matrix->[1][2]; # 6
Dit stelt ons in staat om complexe datastructuren te bouwen, deze compact tussen functies door te geven en object-georiënteerde patronen te implementeren.
Is het mogelijk om toegang te krijgen tot een element van een geneste array (of hash) zonder referenties te gebruiken? Zo ja — hoe, en wanneer werkt dit niet?
Vaak wordt geantwoord dat dit niet kan, maar in werkelijkheid converteert Perl soms "automatisch" structuren. Maar zonder referenties zullen geneste structuren niet werken bij dynamische creatie of bij overdracht als argumenten.
Voorbeeld van onjuiste en juiste toegang:
# Werkt niet zo: my @arr = ( [1,2],[3,4] ); print $arr[0][1]; # 2 # Maar als we het niet als referentie, maar gewoon als array definiëren: my @matrix = ( [1,2], [3,4] ); print $matrix[1][0]; # 3
Geschiedenis
In een groot project probeerde men een referentie naar een array te passeren zonder de operator \, waardoor de interne structuur "uitgevouwen" werd als een scalaire array en leidde tot volledige logica verstoring.
Geschiedenis
Een ontwikkelaar mengde toegang via referentie en zonder referentie in de code, waardoor een deel van de gegevens verloren ging bij geneste foreach-lussen bij het werken met een array van referenties.
Geschiedenis
Bij het werken met een configuratie, genest via een hash van referenties, vergaten ze de referentie te derefereren en benaderden ze het als een hash, wat een "Can't use string ("HASH(0x1234)") as a HASH" runtime error in productie veroorzaakte.