Newsgroup: it.comp.os.linux.sys
Titolo: Problema regexp greedy/ungreedy (perl)

Non capisco bene la sintassi per gestire il greedy
PROBLEMA:
ho una array @aTieFile con stringhe di questo genere:
deb 
http://ppa.launchpad.net/nautilus-dropbox/ppa/ubuntu
 natty main
deb-src 
http://ppa.launchpad.net/nautilus-dropbox/ppa/ubuntu
 natty main
Ho questo if in un ciclo:
if ($aTieFile[$i]=~ m/_ESPRESSIONE-CHE-MI-ESTRAE-URL_/i){
	print "URL  >$1<  \n";
}
SOLUZIONI TESTATE: (nota le 5 Funziona ma aggirando il problema)
Come _ESPRESSIONE-CHE-MI-ESTRAE-URL_ ho usato le seguenti prove:
PROVA1:   \s(https{0,1}\:\/\/.*)\s
PROVA2:   \s(https{0,1}\:\/\/.*)?\s
PROVA3:   \s(https{0,1}\:\/\/.*\s)
PROVA4:   \s(https{0,1}\:\/\/.*?\s)
PROVA5:   \s(https{0,1}\:\/\/\S+)
1,2,3 Mi rispondono con : URL=
http://ppa.
...ubuntu natty<<<
includendomi anche il "natty"
Perchè:
1) non usa il greedy e prende la stringa piu lunga possibile
2) il ? che indica il greedy evedinetmente non è nel posto giusto
3) anche questa come la uno non usa il greedy in piu mi inserisce anche 
lo spazio finale
La 4 mi risponde con URL=
http://ppa.
...ubuntu <<<
Usa il greedy e mi risponde quasi correttamente. Solo che con il \s 
all'interno delle parentesi mi include anche lo spazio finale nella 
risposta, che poi dovrei trimmare.
La 5 mi risponde GIUSTO: URL=
http://ppa.
...ubuntu<<<
Alla fine con la 5 ho risolto, ma la 5 funziona perchè \S inserisce 
tutti i caratteri diversi da spazio, e funzionando con una logica 
inversa aggira il meccanismo del greedy che e quello che non capisco 
bene come utilizzare.
Non ho nulla contro la soluzione 5 (ora che l'ho trovata mi sembra 
migliore in ogni caso); Però adesso che ho incontrato il problema mi 
piacerebbe capire se esiste una soluzione con una logica sul genere 
delle prime 4 che ho provato. Un posto giusto dove inserire il punto 
interrogativo del greedy.
NOTA.
Per chi non vuole impazzire a decifrare il senso della parte comune 
della regex, eccola scomposta e commantata
\s(https{0,1}\:\/\...........
\s      :Comincia con uno spazio (o tab)
( Inizia il gruppo da inserire in $1 e che dovrà essere chiuso
http    :Seguito da http
s{0,1}  :Seguito da un eventuale s di https (vuoi mai)
\:\/\/\ :Seguito da ://
Da qui in poi... si differenzia nelle 5 che ho testato.
Nel caso della 5 per esempio:
\S+ Seguito da uno o piu caratteri diversi da spazio
     (quando incontra  lo spazio si interrompe)
) Chiude la parentesi iniziale mettendo il risultato in $1

 PROVA5:   \s(https{0,1}\:\/\/\S+)
Premesso che l'avrei scritta più o meno così...
  m#\s(https?://[^ ]*)#
... una possibile risposta alla tua domanda potrebbe essere una cosa del
tipo...
  m/\s(https{0,1}\:\/\/.*?)\s/
... che è una delle poche "permutazioni" che non avevi ancora provato :-)
(ma considera che nell'ultimo mio post sulle perlre ho preso un abbaglio)
Fabio

 (ma considera che nell'ultimo mio post sulle perlre ho preso un abbaglio)
Si questa funziona... Ma considera che io avevo TESTATO e PROMOSSO COME 
FUNZIONANTE il tuo abbaglio... (quindi diciamo che salvo smentite sembra 
funzionare)
Mi lascia un po' perplesso mi era sembrato di capire che il ? andava 
messo prima. Googlegiando non sono riuscito a trovare una spiegazione 
che mi sia chiara.
Anche stavolta Grazie 2 Aiuti in un post Solo
1) la risposta che cercavo
2) / --> # (che in teoria sapevo, ma non ho mai applicato)