In Perl is er geen ingebouwde syntaxis voor multidimensionale arrays, zoals dat in sommige andere talen is geïmplementeerd. In plaats daarvan worden arrays van arrays gebruikt, waarbij elk element op het hoogste niveau een verwijzing naar een andere array is. Deze organisatie maakt het mogelijk om flexibele tabellen, matrices en andere datastructuren te modelleren die tweedimensionaliteit of grotere geneste niveaus vereisen.
Oorspronkelijk werd Perl ontwikkeld voor tekstanalyse en het werken met eenvoudige structuren, maar met de komst van verwijzingen (vanaf Perl 5) kregen ontwikkelaars de mogelijkheid om complexe geneste structuren te bouwen — bijvoorbeeld arrays van arrays of hash arrays.
De grootste misvatting onder nieuwe gebruikers: de poging om eenvoudig een tweedimensionale array te creëren — bijvoorbeeld door @matrix = ( (1,2), (3,4) ) te declareren. Deze aanpak zal niet het gewenste resultaat opleveren, aangezien de elementen zullen worden uitgepakt als scalars en niet als geneste structuren. Er wordt ook vaak een fout gemaakt bij het kopiëren van arrays: oppervlakkige kopie leidt tot onverwachte bijeffecten.
In Perl worden multidimensionale arrays opgebouwd door middel van verwijzingen naar arrays. De juiste initialisatie ziet er als volgt uit:
my @matrix; for my $i (0..2) { for my $j (0..2) { $matrix[$i][$j] = $i * $j; } } # Toegang tot element: $matrix[1][2]
Of via anonieme verwijzingen:
my $matrix = [ [1,2,3], [4,5,6], [7,8,9] ]; print $matrix->[1][2]; # 6
Belangrijke kenmerken:
Is het mogelijk om multidimensionale arrays zonder verwijzingen te creëren, gewoon door haakjes binnen haakjes te declareren, zoals in andere talen?
Nee. In dit geval dereferent Perl de elementen als een gewone lijst. Alleen het gebruik van verwijzingen is correct.
Voorbeeld van onjuiste code:
my @matrix = ((1,2,3),(4,5,6),(7,8,9)); # Elementen worden op één lijn gezet print $matrix[3]; # 4, niet [4,5,6] — onjuiste werking
Correcte manier:
my @matrix = ( [1,2,3], [4,5,6], [7,8,9] ); print $matrix[1][2]; # 6
Wat gebeurt er als je een array van arrays simpelweg toewijst?
Alleen het hoogste niveau wordt gekopieerd, de geneste arrays zullen naar dezelfde geheugengebieden verwijzen.
Voorbeeld:
my @a = ( [1,2], [3,4] ); my @b = @a; $a[0][0] = 99; print $b[0][0]; # 99, terwijl we 1 verwachtten — oppervlakkige kopie!
Is het mogelijk om "diep" een geneste array te kopiëren met de ingebouwde functionaliteiten van Perl?
Nee, Perl biedt geen standaard diep-kopieeroperator voor geneste structuren. U moet de Storable-module gebruiken of een recursieve functie.
Voorbeeld met Storable:
use Storable 'dclone'; my $deepcopy = dclone(\@matrix);
Een ontwikkelaar maakt eenvoudig een tweedimensionale matrix door een array te declareren en deze te kopiëren met een toewijzing:
my @m1 = ([1,2],[3,4]);
my @m2 = @m1;
$m1[0][0] = 77;
print $m2[0][0];
Voordelen:
Nadelen:
Gebruik van de Storable-module voor diepe kopie:
use Storable 'dclone'; my @m1 = ([1,2],[3,4]); my $m2 = dclone(\@m1); $m1[0][0] = 77; print $m2->[0][0]; # 1
Voordelen:
Nadelen: