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\.]+)';