Newsgroup: it.comp.lang.perl
Titolo: regexp complicata

Salve,
     sto programmando un piccolo server che ricever la classica http 
request fatta dal client con GET, a seconda della prima linea di 
richiesta dovrei chiamare una subroutine apposita, a seconda della 
richiesta potrei ricevere una di queste righe:
GET daap://
127.0.0.1:3689/server-info
 HTTP/1.1
GET daap://
127.0.0.1:3689/content-codes
 HTTP/1.1
GET daap://
127.0.0.1:3689/login
 HTTP/1.1
GET daap://
127.0.0.1:3689/update?session-id=[num]
 HTTP/1.1
GET daap://
127.0.0.1:3689/databases?session-id=[num]&revision-id=[num]
 
HTTP/1.1
GET 
daap://
127.0.0.1:3689/databases/[num]/items?type=music&session-id=[num]&r
evision-id=[num] HTTP/1.1
GET 
daap://
127.0.0.1:3689/databases/[num]/items/[num].mp3?session-id=[num]&re
vision-id=[num] HTTP/1.1
ad esempio nel caso di:
dovrei chiamare una sub _server-info{}
o se ricevo:
GET daap://
127.0.0.1:3689/update?session-id=[num]
 HTTP/1.1
dovrei chiamare una sub _update{num}
nel caso di:
GET 
daap://
127.0.0.1:3689/databases/[num]/items/[num].mp3?session-id=[num]&re
vision-id=[num] HTTP/1.1
dovrei chiamare una sub 
_song{num_database,num_mp3,num_session_id,num_revision_id}
so che per fare questo ho bisogno di una reg exp match, ma non so 
proprio da dove iniziare per scriverla. Da notare che 
127.0.0.1:3689
 pu 
cambiare.
c'č qualcuno disposto ad aiutarmi?
Grazie

 so che per fare questo ho bisogno di una reg exp match,
Per fare questo ci sono moduli appositi: URI, URI::QueryParam.
 
http://search.cpan.org/~gaas/URI-1.35/
 
Max

 c'è qualcuno disposto ad aiutarmi?
Tutti immagino ;-)
Pero` la regex e` meglio di no, perche` (se si volessero contemplare
tutti i casi possibili) sarebbe estremamente complicata e di conseguenza
molto fragile.
Invece tutto diviene molto semplice (e robusto) utilizzando la
distribuzione URI che, come si evince dal nome, e` fatta precipuamente
per questo mestiere.
http://search.cpan.org/dist/URI/
Esempio:
use strict;
use warnings;
use URI;
use URI::QueryParam;
my $line =
'GET
daap://
127.0.0.1:3689/databases/[num]/items/[num].mp3?session-id=[num]&revision-id=[num]
 
HTTP/1.1';
# Butta via la "GET " iniziale e la " HTTP/1.1" finale.
$line =~ m{^GET (.*) HTTP/1\.1$};
my $u = URI->new($1);
print $u->scheme       , "\n"; # daap
print $u->authority    , "\n"; # 
127.0.0.1:3689
print $u->path         , "\n"; # /databases/[num]/items/[num].mp3
print $u->path_segments, "\n"; # In list context restituisce la lista:
                                # (databases, [num], items, [num].mp3)
print $u->query        , "\n"; # session-id=[num]&revision-id=[num]
# E per l'estrazione dei valori di ogni parametro della query string:
foreach my $param ( $u->query_param ) {
     print "$param: ", join( ', ', $u->query_param($param) ), "\n"
}
# che stampa:
#
# session-id: [num]
# revision-id: [num]
-- 
Ciao,
Emanuele.

 Tutti immagino ;-)
Grazie ad entrambi,
       dato il path dell'url ho bisogno da fare un match per chiamare la 
sub apposita...
va bene una cosa del genere?
if ( m~/server-info/ ) { &_server_info() }
qualè in una RE la differenza tra:
^/server-info e /server-info
ma ora veniamo al caso in ci siano dei numeri nel path [num]
daap://
127.0.0.1:3689/databases/[num]/items/[num].mp3
si pu fare im match con:
m~ ^/databases/\d+/items/(\d+)\.
e sopratutto le parentesi graffe vanno messe o no?
{^/databases/\d+/items/(\d+)\.}
si pu accedere con $1 e $2 ai rispettivi due \d+ nel path?
a cosa serve il costrutto
qr{}
scusate, adesso non ho il terminale a disposizione quindi non posso 
provare tutto quello che ho scritto...
grazie ancora