Perl: komentarze w wyrażeniach regularnych, czyli jak pisać zrozumiałe regexp-y

W przypadku bardziej skomplikowanych zapytań regularnych przydaje się wiedzieć za co odpowiadają poszczególne jego fragmenty. Sztuczką pozwalają to osiągnąć jest skorzystanie z przełącznika x przy wyszukiwaniu oraz komentarzy oznaczonych zwykłym #, wieloliniowości oraz spacji (standardowo ignorowanych właśnie dzięki temu '/x’. Spójrzmy na poniższy przykład:

Jeżeli chcemy skorzystać z przełącznika '/x’, musimy pamiętać że znaki nowych linii, spacje i znaki za '#’ będą ignorowane więc wszystkie spacje występujące w wyszukiwanym ciągu musimy zastąpić standardowym \s. Tak więc jeżeli mamy linie tekstu:

ziutus@sv213 [/home/ziutus]# uptime
 09:19:24 up 18 days,  6:05,  1 user,  load average: 1.08, 1.00, 1.00

RegExp wyszukujący informacje o czasie pracy urządzanie, zalogowanych użytkownikach oraz obciążeniu systemu może mieć następującą formę:

#! /bin/perl

    my $regexp  = '(\d{2}:\d{2}:\d{2})\s*up#current time (Hour:Minutes:Seconds)
    \s*(\d+)\s*days,#how many days server is up
    \s*(\d{2}:\d{2}),#how many hours and minutes is up
    \s*(\d+)\s+users,#how many users are logged
    \s*load\s+average:
    \s*([\d\.]+),# average usage in last 5 minutes,
    \s*([\d\.]+),# average usage in last 10 minutes
    \s*([\d\.]+)# average usage in last 15 minutes';

i sposób jego użycia:

 if ($Line =~  /$regexp/x ) {
    
        $Return{"CurrentTime"}="$1";
        $Return{"Up"}="$2 days $3";
        $Return{"Users"}="$4";
        $Return{"LoadAverageLast5Minutes"} = $5;
        $Return{"LoadAverageLast10Minutes"} = $6;
        $Return{"LoadAverageLast15Minutes"} = $7;
        
    }

Prawda, że jest to bardziej czytelne niż poniższe?

    my $regexp  = '(\d{2}:\d{2}:\d{2})\s*(\d+)\s*(\d{2}:\d{2}),\s*(\d+)\s+users,\s*load\s+average:\s*([\d\.]+),\s*([\d\.]+),\s*([\d\.]+)';

Dodaj komentarz