De range-operator (..) is een van de unieke hulpmiddelen in Perl voor het genereren van sequenties of het volgen van een bepaalde reeks voorwaarden. Afhankelijk van de context werkt deze als een lijstgenerator of als een logische vlag.
Achtergrond:
Perl heeft vanaf de eerste versies het gemakkelijk gemaakt om lijsten te maken, bijvoorbeeld (1..10), zonder expliciete lussen te hoeven schrijven. Maar deze operator gedraagt zich op een bijzondere manier binnen voorwaardelijke expressies.
Probleem:
Veel mensen verwarren de lijst (generatie van een sequentie in lijstcontext) met "flip-flop" (zelf-activerende range in logische context). In het eerste geval is het resultaat een array van getallen/strings, in het tweede geval een controle vlag binnen een bepaald stuk code.
Oplossing:
Begrijp het verschil tussen de contexten. Gebruik de operator in schalair of lijstcontext buiten voorwaarden voor het genereren van lijsten. In logische context werkt de operator als "tussen X en Y" (werken met vlaggen).
Voorbeeldcode:
# Lijst van getallen van 1 tot 10 my @nums = (1..10); # Lijst van letters my @letters = ('a'..'f'); # "Flip-flop" vlag while (<DATA>) { print if /START/ .. /END/; }
Belangrijkste kenmerken:
Wat is het resultaat van de expressie (1..5) in schalair en in lijstcontext?
In schalair context (1..5) geeft het het getal terug dat gelijk is aan het laatste getal van de reeks — 5. In lijstcontext — de array 1,2,3,4,5.
Hoe werkt flip-flop binnen geneste voorwaarden (bijvoorbeeld in een lus met twee flip-flop)?
Elke flip-flop operator is een onafhankelijke "teller-vlag" op elke regel (of iteratie). Als de voorwaarden elkaar overlappen of in elkaars verlengde liggen, kan het resultaat onverwacht zijn, vooral bij het lezen van meerdere blokken.
Wat gebeurt er als je strings in plaats van getallen in de range gebruikt? Bijvoorbeeld, ('aa'..'ad')
Perl genereert een sequentie van strings in alfabetische volgorde: ('aa', 'ab', 'ac', 'ad'). Werkt alleen met geldige Latijnse letters zonder Unicode.
Lezen van een logbestand via een while-lus, met een range met een onjuiste voorwaarde, waardoor niet alle interessante regels worden weergegeven.
Voordelen:
Nadelen:
Voorwaarden voor flip-flop expliciet onderscheiden, testen op onjuiste gevallen, extra controles toevoegen.
Voordelen:
Nadelen: