[PERL] [REGEXP] Błedne parsowanie adresu URL?

0

Witam. Mam następujący skrypt PERL:

#!usr/bin/perl
@plik = <STDIN>;
foreach(@plik)
{
if ($_ =~ /^((\d+)(\.\d+){3}) - - \[(\d{1,2})\/(\w{1,3})\/\d{4}(:\d\d){3} \+0100\] \"\w{3,7} ([\w\/\+\=\%\&\_\.\~\?\-]*)*([a-zA-Z0-9 \/\.\"-\;!]+)$/)
{
print "$1|$2|$3|$4|$5|$6|$7|$8\n";
}
}

Jednak gdy przekażę mu następujący napis:
67.195.37.95 - - [27/Feb/2009:23:32:08 +0100] "GET /taxonomy/term/1506 HTTP/1.0" 200 19127 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
wyświetla mi wszystko oprócz tego fragmentu URL, który powinien się znaleźć w zmiennej $7. Już nawet próbowałem parsować wszystkie ukośniki tego URL, myśląc, że wpływa to jakoś na wynik terminala.. Proszę o pomoc!

0

Mógłbyś wstawić po prostu ten fragment który nie działa a nie regexpa na cały ekran ;]
Jesteś pewien że dobrze stosujesz tam zachłanne dopasowanie * a nie chciałeś czasem dopasowania *?
Sama * dopasuje ci ile się tylko da, więc możliwe że wcześniejsze dopasowanie zgarnia za dużo.

0

([\w\/\+\=\%\&\_\.\~\?\-]*)*
Dokładnie o ten fragment chodzi. Ten nawias powinien być odczytany jako adres(właściwie fragment) URL.
Mam caly plik ktory zawiera takie wiersze jak podalem w pierwszym poście. Powiedzmy ze jest to plik.txt. Po wywołaniu w terminalu tego skryptu
perl skrypt < plik.txt | head -5 n
Dostaję coś takiego w wyniku:
67.195.37.95|67|.95|27|Feb|:08|| HTTP/1.0" 200 19127 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
Czyli kolejne nawiasy oddzielam sobie znakiem "|". No i w miejscu gdzie powinen byc siódmy nawias, z adresem url nie wyświetla się nic...

0

OMG a potrafisz napisać CO ten fragment wg ciebie powinien matchowac? Zgaduje że chciałeś złapać to:

/taxonomy/term/1506

?
Jeśli tak to:

$_ =~ /^((\d+)(\.\d+){3}) - - \[(\d{1,2})\/(\w{1,3})\/\d{4}(:\d\d){3} \+0100\] \"\w{3,7} ([\w\/\+\=\%\&\_\.\~\?\-]*)([a-zA-Z0-9 \/\.\"-\;!]+)$/

1 użytkowników online, w tym zalogowanych: 0, gości: 1