Der Bereichsoperator (..) ist eines der einzigartigen Werkzeuge von Perl zur Erzeugung von Sequenzen oder zur Verfolgung eines bestimmten Bereichs von Bedingungen. Je nach Kontext funktioniert er entweder als Listen-Generator oder als logische Flagge.
Hintergrund:
Perl erlaubte seit den ersten Versionen die einfache Erstellung von Listen, z.B. (1..10), ohne dass explizite Schleifen geschrieben werden mussten. Aber dieser Operator verhält sich innerhalb von Bedingungsausdrücken besonders.
Problem:
Viele verwechseln Listen (Erzeugung einer Sequenz im Listen-Kontext) und "flip-flop" (selbstaktivierender Bereich im logischen Kontext). Im ersten Fall ist das Ergebnis ein Array von Zahlen/Zeitstempeln, im zweiten ein Steuerflag an einer bestimmten Stelle im Code.
Lösung:
Den Unterschied zwischen den Kontexten verstehen. Für die Erzeugung von Listen im Skalarkontext oder Listen-Kontext außerhalb von Bedingungen verwenden. Im logischen Kontext funktioniert der Operator wie "zwischen X und Y" (Arbeit mit Flags).
Beispielcode:
# Liste von Zahlen von 1 bis 10 my @nums = (1..10); # Liste von Buchstaben my @letters = ('a'..'f'); # "Flip-flop" Flag while (<DATA>) { print if /START/ .. /END/; }
Wesentliche Merkmale:
Was ist das Ergebnis des Ausdrucks (1..5) im Skalarkontext und im Listen-Kontext?
Im Skalarkontext gibt (1..5) die Zahl zurück, die der letzten Zahl des Bereichs entspricht — 5. Im Listen-Kontext — das Array 1,2,3,4,5.
Wie funktioniert flip-flop innerhalb von verschachtelten Bedingungen (zum Beispiel in einer Schleife mit zwei flip-flop)?
Jeder flip-flop-Operator ist ein unabhängiger "Zähler-Flag" auf jeder Zeile (oder Iteration). Wenn sich die Bedingungen überschneiden oder überlagern, kann das Ergebnis unerwartet sein, insbesondere beim Lesen mehrerer Blöcke.
Was passiert, wenn Strings anstelle von Zahlen im Bereich verwendet werden? Zum Beispiel, ('aa'..'ad')
Perl wird eine Sequenz von Strings in alphabetischer Reihenfolge erzeugen: ('aa', 'ab', 'ac', 'ad'). Funktioniert nur mit gültigen lateinischen Buchstaben ohne Unicode.
Sie lesen eine Log-Datei über while und verwenden einen Bereich mit einer falschen Bedingung, wodurch nicht alle interessierenden Zeilen ausgegeben werden.
Vorteile:
Nachteile:
Ausdrücklich Bedingungen für flip-flop definieren, auf ungültige Fälle testen, zusätzliche Überprüfungen hinzufügen.
Vorteile:
Nachteile: