🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #39785

Re: pierwsze podejscie nietrafione: regex w wielu liniach, mam problem

#39785
From: Grzegorz Szyszlo
Date: Wed, 20 Oct 2004 11:13
127 lines
6458 bytes
Maciej Misiak wrote:
>>A wiec jedyne co jest do zrobienia to w sekcji $smieci zabronic kropce 
> 
> lykania 
> 
>>interesujacych nas ciagow jakims, na moje oko, interesujacym assertem. 
> 
> Jeszcze 
> 
>>nad tym posiedze.
> 
> 
> Albo moze troche inne podejscie:
> 1. wyciac smieci
> 2. zastosowac prostego regexpa do wyciagniecia danych
> 
> my$cutline='';
> my$regexp = '(Job Type\s*:|'.
>             'Backup mode\s*:|'.
>             'Job Start Time\s*:|'.
>             ':\s*Media\s*:|'.
>             'Backup Last Objects\s*:|'.
>             'Job End Time\s*:|'.
>             'Completed Size\s*:|'.
>             'Failed Objects\s*:|'.
>             'Job Completed Succ?essfully|Job)';
> $cutline.="$1$2\n" while $line =~ /^\s*$regexp(.*)$/mg;
> $cutline=~s/^$dwukropek//mg;
> 
> print"Po wycieciu smieci:\n$cutline\n\n";
> 
> $cutline=~/Job\s*(.+)\n
>         Job\ Type             $dwukropek (.+)\n
>        Backup\ mode          $dwukropek (.+)\n
>         Job\ Start\ Time       $dwukropek (.+)\n
>         ((?:Media      $dwukropek .+\n)*)
>         (?:Backup\ Last\ Objects? $dwukropek (.+)\n)?
>         (?:Job\ End\ Time        $dwukropek (.+)\n)?
>         Completed\ Size       $dwukropek (.+)\n
>         (?:Failed\ Objects       $dwukropek (.+)\n)?
>         (?:(Job\ Completed\ Succ?essfully).*\n)?
>         (?:Media $dwukropek Home\\.+? - .+? \\ ([^\n\\]+))?
> /x;

> Acha, Media sie pojawia dwa razy(!), wiec wrzucilem w calosci do $5

z media jest gorzej niz myslalem. pierwsze wystapienie po job start time
trzeba pominac, bo tam media jest, albo i nie ma. drugie wystapienie media
trzeba lyknac, ono powinno wystapic prawie zawsze po opcjonalnym
"Job Completed Succ?esfully".

W koncu zdecydowalem sie na uzycie funkcji pos, bo wycinanie smieci
jest dla mnie troche nieintuicyjne, i moze zawiesc. w koncu istotny kawalek
tego kodu wyglada tak:

----------------------------------
   pos($line)=0; $pozycja=0;

   if ($line=~/  ^Job \s                              ([^\n]+) \n                /xgm)
   {$tab[1]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s Job\ Type \s+             : \s ([^\n]+) \n                /xgm)
   {$tab[2]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s Backup\ mode \s+          : \s ([^\n]+) \n                /xgm)
   {$tab[3]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s Job\ Start\ Time \s+      : \s ([^\n]+) \n                /xgm)
   {$tab[4]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s+ Backup\ Last\ Objects? \s+ : \s+ End \s+ ([^\n]+) \n       /xgm)
   {$tab[5]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s+ Job\ End\ Time \s+         : \s ([^\n]+) \n                /xgm)
   {$tab[6]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s Completed\ Size \s+       : \s ([\d]+) [^\n]* \n          /xgm)
   {$tab[7]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s Failed\ Objects \s+       : \s ([^\n]+) \n                /xgm)
   {$tab[8]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\s (Job\ Completed\ Succ?essfully) [^\n]* \n                 /xgm)
   {$tab[9]=$1 ne ''; $pozycja=pos($line);} else {pos($line)=$pozycja;}

   if ($line=~/  ^\s\sMedia \s+  : \s Home\\[^\n]+? - [^\n]+? \\ ([^\n\\]+) \n   /xgm)
   {$tab[10]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
-------------------------------

opcje /x sobie zostawilem, zebym nie musial zlepiac tych wyrazen.
/m jest mi potrzebne, bo uzywam ^
/g potrzebne, zeby mi to dzialalo podobnie do wielokrotnego wyszukiwania tego
       samego wyrazenia, tyle ze tutaj symuluje za kazdym razem wyszukiwanie
       czegos innego.

btw. dzieki za pomoc, twoje rozwiazanie tez jest skuteczne :)
myslalem tez nad innym wariantem, zeby .... podobnie jak ty niszczyc pierwotny
wyglad przeszukiwanego tekstu, poprzez wyszukiwanie s/ / / .
czyli zamiast m/ ... /g i manipulacji funkcja pos, po prostu stopniowo
odcinalbym to, co bym wlasnie znalazl. ale uznalem ze stopien komplikacji
programu bylby zblizony, a ja nigdy nie wiem czy kolejna nowa wersja
programu do backupu lub kolejny fix, nie zrobi mi jakiejs rewolucji.
glownym mankamentem twojego rozwiazania jest to, ze pomiedzy rexexpem
odsmiecajacym i wyszukujacym, musi byc zachowana pelna synchronizacja.
z kolei obydwa rozwiazania, zakladaja z gory zadana kolejnosc wyszukiwanych
informacji, co w tym przypadku nie jest istotnym problemem, ale ...
... w moim rozwiazaniu manipulujac przy pos(), moge w przyszlosci
sobie pozwolic na obsluge nietypowych kolejnosci.

I na koniec slowko do Szymona. mozesz smialo powiedziec
ze zniku znowu nakombinowal jak kon pod gore :)))))


na tym przykladzie bede musial ponownie zrewidowac swoja nikla
nazwijmy to wiedze, na temat zachlannosci wyrazen. nie potrafilem
tu znalezc operatora, o zachlannosci posredniej pomiedzy
dla przykladu * i *? . Chodzi tu w szczegolnosci
o zachlanna wersje operatora ?, bo normalnie jest on chyba
niezachlanny, czego wczesniej nigdy nie bralem pod uwage.
wylazlo to na przykladzie ( .... )?  [ tutaj pojawil
sie wariant (?: ... (...) ...)?   ]  ktore jak nie musi,
to nie dopasuje kompletnie niczego.


poniewaz juz mi dziala, to dziekuje wszystkim za uwage :)

znik.
Technical Details
Message-ID: <cl5h9t$l3j$1@news.lublin.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mail
References: <30b7.00000127.4174ef5d@newsgate.onet.pl> <30b7.00000169.4174fa63@newsgate.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mail
From: Grzegorz Szyszlo <znik@wbc.lublin.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: pierwsze podejscie nietrafione: regex w wielu liniach,      mam problem
Date: Wed, 20 Oct 2004 13:13:18 +0200
Organization: lubman
Lines: 128
Message-ID: <cl5h9t$l3j$1@news.lublin.pl>
References: <30b7.00000127.4174ef5d@newsgate.onet.pl> <30b7.00000169.4174fa63@newsgate.onet.pl>
NNTP-Posting-Host: user.wbc.lublin.pl
Mime-Version: 1.0
X-Trace: news.lublin.pl 1098270846 21619 212.182.104.10 (20 Oct 2004 11:14:06 GMT)
X-Complaints-To: abuse@news.lublin.pl
NNTP-Posting-Date: Wed, 20 Oct 2004 11:14:06 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030721 Debian/1.4-1.nobse.2
X-Accept-Language: pl, en-us
In-Reply-To: <30b7.00000169.4174fa63@newsgate.onet.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit