Operator zakresu (..) jest jednym z unikalnych narzędzi Perla do generowania sekwencji lub śledzenia określonego zakresu warunków. W zależności od kontekstu działa albo jako generator listy, albo jako flaga logiczna.
Historia pytania:
Perl od pierwszych wersji umożliwiał łatwe tworzenie list, na przykład (1..10), bez potrzeby pisania jawnych pętli. Ale ten sam operator zachowuje się w szczególny sposób wewnątrz wyrażeń warunkowych.
Problem:
Wielu myli listę (generowanie sekwencji w kontekście listy) z "flip-flop" (samozwalniający się zakres w kontekście logicznym). W pierwszym przypadku wynikiem jest tablica liczb/łańcuchów, w drugim — flaga sterująca na określonym fragmencie kodu.
Rozwiązanie:
Rozumieć różnice między kontekstami. Do generacji list używać w skalarowym lub listowym kontekście poza warunkami. W kontekście logicznym operator działa jako "między X a Y" (praca z flagami).
Przykład kodu:
# Lista liczb od 1 do 10 my @nums = (1..10); # Lista liter my @letters = ('a'..'f'); # Flaga "Flip-flop" while (<DATA>) { print if /START/ .. /END/; }
Kluczowe cechy:
Jaki będzie wynik wyrażenia (1..5) w kontekście skalarnym i listowym?
W kontekście skalarnym (1..5) zwróci liczbę równą ostatniej liczbie zakresu — 5. W kontekście listowym — tablicę 1,2,3,4,5.
Jak działa flip-flop wewnątrz zagnieżdżonych warunków (na przykład w pętli z dwoma flip-flop)?
Każdy operator flip-flop to niezależny "licznik-flaga" na każdej linii (lub iteracji). Jeśli warunki się pokrywają lub nakładają, wynik może być niespodziewany, zwłaszcza przy odczycie wielu bloków.
Co się stanie, jeśli użyjemy łańcuchów zamiast liczb w zakresie? Na przykład, ('aa'..'ad')
Perl wygeneruje sekwencję łańcuchów w porządku alfabetycznym: ('aa', 'ab', 'ac', 'ad'). Działa tylko z dozwolonymi literami łacińskimi bez unicode.
Odczytywanie pliku logowego przez while, używając zakresu z niewłaściwym warunkiem, co powoduje, że nie są odczytywane wszystkie interesujące linie.
Zalety:
Wady:
Wyraźne wydzielanie warunków dla flip-flop, testowanie na niepoprawnych przypadkach, dodawanie dodatkowych sprawdzeń.
Zalety:
Wady: