Newsgroup: it.comp.lang.perl
Titolo: espessione regolare "altalenante"

Ciao,
ho realizzato un semplice script che dovrebbe dividere in due delle
stringhe nel formato:
programma-2.3.4
prigramma2-1.2
tra le righe di codice:
$i = index ($_,/-[0-9]+..*/);
e poi lo uso per dividere la stringa $_ in due parti:
$software = substr($_,0,$i-1);
$versione = substr ($_,$i);
il problema è che applicandolo alle stringhe estratte col comando "rpm
-qa" alcune le elabora correttamente e altre no..........
la regex sembra giusta ma il suo comportamento è strano...
suggerimenti?
Lestat
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

suggerimenti?
Senza sapere che cosa speri di ottenere, che cosa ritieni "corretto" e che
cosa "strano" a fronte di quale input, è un po' difficile dare
"suggerimenti".
Di certo, l'espressione
     $i = index ($_,/-[0-9]+..*/);
non sembra neppure particolarmente "giusta" per qualunque ragionevole
obiettivo. Sulla base della sola cerenza interna, proporrei piuttosto:
 
   $i = index ($_,/-[0-9]+\..*/);
oppure
   $i = index ($_,/-[0-9]+.*/);
Che poi una di queste soddisfi le tue esigenze è altra questione.  
Ciao.

   $i = index ($_,/-[0-9]+.*/);
O anche:
   $i = index ($_,/-[0-9]+.+/);
Ciao.

perldoc -f index
The index function searches for one string within another, but without the
wildcard-like behavior of a full regular-expression pattern match.
vuol dire che non posso usare le regex all'interno di index???
io parto da
programma1-1.2.3
programma-0.6.5
e vorrei otterere le coppie di stringhe
programma1       1.2.3
programma        0.6.5


perldoc -f index
The index function searches for one string within another, but without the
wildcard-like behavior of a full regular-expression pattern match.
vuol dire che non posso usare le regex all'interno di index???
io parto da
programma1-1.2.3
programma-0.6.5
e vorrei otterere le coppie di stringhe
programma1       1.2.3
programma        0.6.5
Lestat


programma        0.6.5
La versione è sempre in fondo alla stringa, sempre separata da un trattino?
Si potrebbe tentare, in prima approssimazione, qualcosa del genere:
   ($versione) = ($_ =~ /-(\d+(\.\d+)*)$/);
che però non ho tempo in questo momento di testare. In seguito, puoi
estrarre il nome del programma con qualcosa come:
  $programma = substr($_, 0, -length($versione));
che però parimenti non ho tempo di testare. Ovvero, puoi usare la funzione
pos, o anche (sebbene introduca un certo degrado nelle prestazioni) le
variabili $` e $'. Si potrebbe anche fare uno split su /-/ e raccogliere i
pezzi, o ancorarlo in qualche modo all'ultima occorrenza del trattino.
Ciao.

grazie, proverň i tuoi suggerimenti.
putrtoppo il trattino puň essere presente anche nel nome del programma e
nella versione, qualcosa tipo
programma12-bello2-11.2-23-4 diventa rognosetto...
$programma = programma12-bello2;
$versione = 11.2-23-4;
il discriminante per la versione č il primo trattino seguito da un valore
numerico.


numerico.
A parte che sono sicuro che rpm è in grado di fornire esplicitamente la
versione di ogni pacchetto, e a parte che sono convinto che questa sarebbe
la strada migliore da seguire, proseguendo questo mio ignobile uso di
pubblicare codice non testato, si potrebbe provare qualcosa del genere:
      ($versione) = ($_ =~ /-(\d+((\.|-)\d+)*)$/);
Ciao.

       ($versione) = ($_ =~ /-(d+((.|-)d+)*)$/);
non ti preoccupare lo testo io ;-)
ho mannato rpm e ho trovato solo il comando "rpm -qa" che fa al caso mio,
restituento appunto il nome completo di versione.
altrimenti dovrei per ogni pacchetto chiedere la versione, ma come faccio
ad avere l'elenco dei pacchetti installati (senza versione)? è un gatto
che si mangia la coda...
non basterebbe questo : $versione = $_ =~ /-d+.*/;   ???
alla prima occorrenza di un - seguito da un numero è tutto $versione...
dicono che una volta imparate le regex sai mezzo perl... a furia di
sbatterci la testa me la spacco o le capisco ;-)
cmq grazie


, scriveva:


non basterebbe questo : $versione = $_ =~ /-d+.*/;   ???
Se ti fidi, potrebbe anche bastare, scritto nel modo giusto (in un contesto
di lista) e magari ancorato alla fine della stringa:
     ($versione) = ($_ =~ /-d+.*$/);
Quel '.*' in fondo, però, ricorda, tira su cani e porci, e non mi risulta
che sia in qualche modo impedito di nominare un pacchetto questo-2-quello,
o simili.
Ciao.

scusa ma
$perl -e'@rpmqa=split /\n/,`rpm -qa`; \
foreach (@rpmqa) { /-(\d+.)+/ && print "$`\n" }'
cosi' prendi esattamente il pre-match della condizione da te proposta.
sempre che sia quella giusta ;-)
corin-e
-- 
Lascia l'accetta
Accetta l'ascia

che sia possibile.
Di fatto ci sono, neanche a dirlo, diversi moduli perl di interfaccia al
database RPM: RPM::Info, Perl-RPM (
http://www.blackperl.com/Perl-RPM
), ecc.
in vario stadio di sviluppo.
Ciao.