Geschiedenis van de vraag:
Sneden (slices) zijn een krachtige functie van Perl, waarmee je in één operatie meerdere elementen uit een array of hash kunt extraheren of toewijzen. Het mechanisme van sneden bestaat al sinds de vroege versies van Perl, ondersteunt een syntaxis die lijkt op die van de programmeertaal Python, maar heeft zijn eigen uitvoerings- en contextkenmerken.
Probleem:
De belangrijkste moeilijkheid met sneden: het onderscheiden van array- en hash-sneden, hun scalair/lijstcontext, 'fijne' nuances bij toewijzing via snede (vooral als de toewijzing naar dezelfde arrays of hashes gaat, of als herhalende indexen worden gebruikt). Een belangrijk punt – als je met sneden de structuur bijwerkt, kun je gemakkelijk per ongeluk een onduidelijke uitkomst krijgen door automatische lijstexpansie.
Oplossing:
Gebruik sneden altijd bewust. Als je een kopie van gegevens moet maken, gebruik dan een expliciete kloning van de lijst. Voorkom overlappingen bij lezen en schrijven, en let expliciet op de scalair/lijstcontext, als de snede wordt gebruikt als argument voor een functie of als element in een expressie.
Voorbeeldcode:
my @array = (10, 20, 30, 40, 50); my @slice = @array[1, 3]; # (20, 40) @array[0, 2] = (100, 300); # @array is nu (100, 20, 300, 40, 50) my %hash = (foo => 1, bar => 2, baz => 3); my @vals = @hash{"foo", "baz"}; # (1, 3)
Kernkenmerken:
Valkuilvraag 1: Kan ik een "scalair" waarde uit de snede @array[2, 4] halen als $val = @array[2, 4]?
Nee, $val zal in dit geval gelijk zijn aan het aantal elementen (de lengte van de lijst), en niet aan de waarde van een enkel element. De correcte manier om toegang te krijgen tot afzonderlijke elementen is via enkele indexen: $array[2].
Valkuilvraag 2: Wat wordt er opgeslagen als er herhalende indexen in de snede zijn?
Opeenvolgende toewijzing: voor elke index wordt van links naar rechts een toewijzing uitgevoerd, de laatste wint. Bijvoorbeeld:
@array[0,0] = (1,2); # $array[0] == 2
Valkuilvraag 3: Kan ik sneden toewijzen met een verschillend aantal elementen aan de rechter- en linkerkant?
Ja, als er rechts minder zijn, krijgen de resterenden undef. Als er meer zijn, worden de overtollige genegeerd. Dit is meestal een bron van moeilijk te ontdekken fouten.
Een ontwikkelaar wijst waarden toe: @array[2, 3] = ("foo");
Hij verwachtte dat beide elementen "foo" zouden krijgen, maar $array[3] werd undef.
Voordelen:
Nadelen:
Gebruikt de functie map voor het in kaart brengen van waarden: @array[2, 3] = map { "foo" } (2, 3);
Voordelen:
Nadelen: