Newsgroup: it.comp.lang.perl
Titolo: regex per sort

Bene. dopo avervi tediato con il sort, mi sono accorto che la mia regex non
funziona. cioè funziona in modo strano. la regex in questione
 ~/(\b[\s|,]\d+-\d+\b)+/g
per come la vedo io dovrebbe 'matchare' con "cifra qualsiasi (preceduta da
uno spazio O da una virgola) ripetuta più volte, seguita da -, seguita da
cifra qualsiasi ripetuta più volte, il tutto ripetuto più volte". Ho usato
[\s|,] per escludere argomenti della regex preceduti da altro testo (ex:
YRF1-1), e per matchare esattamente spazio1401759-1401789 e (sottolineo E)
,1402174-1402553 eventualmente presenti nelle stringhe in analisi. La cosa
strana è che, se entrambe i tipi di argomento della re sono presenti nella
stringa, lo script mi ritorna solo il mathc preceduto dalla virgola. Allora,
l'operatore | è di tipo preferenziale? nel senso che, nell'ambito da me
considerato, se ho aa e bb è esatto che aa|bb ritorni solo bb e non
entrambi?
ciao
stefano

nel primo post non hai specificato che si trattava di una stringa che dovevi
dividere in elementi e POI ordinare sulla base della cifra precedente al
'-'!
Allora al posto di @array  usa (o setta @array con) 'split PATTERN STRING'.
comunque posta qui una stringa completa reale, cosě ti aiutiamo meglio
ciao
--
________________________________________________________________________
"Individual rights are the means of subordinating society to moral law. -
Ayn Rand"

ORFN:Q0105 COB, Chr Mito from
36540-36954,37723-37736,39141-39217,40841-41090,42508-42558,43297-43647
In base al tuo suggerimento ho provato così, solo per printare gli argomenti
dell' @array, ma ovviamente c'è qualcosa che non va:
while (!eof(IN)) {
    $line=<IN>;
    @array= split /\b\d+-\d+\b/g, $line;
    print "$array[*]\n";
}
*con 0 stampa da > allo spazio dopo 'from', con 1 stampa le prime ','
...che fine hanno fatto i pattern che cerco? sono almeno sulla strada
giusta?
grazie per l'aiuto
stefano

Scusa, ma nella mia richiesta era anche implicito, oltre all'input, anche e
soprattutto l'output!
questo è l'input, OK:
  >ORFN:Q0080 AAP1, Chr Mito from 27666-27812
  >ORFN:Q0085 ATP6, Chr Mito from 28487-29266
  >ORFN:Q0092 Q0092, Chr Mito from 30874-31014
  >ORFN:YAL003W EFB1, Chr I from 142172-142251,142618-143158
  >ORFN:Q0105 COB, Chr Mito from
e quale dovrebbe essere l'output?
--
________________________________________________________________________
"Why isn't phonetically spelled that way? "

 e quale dovrebbe essere l'output?
sorry!
output (@array) da ordinare:
27666-27812
28487-29266
30874-31014
142172-142251
142618-143158
36540-36954
37723-37736
39141-39217
40841-41090
42508-42558
43297-43647
Comunque, cosa ho scritto ieri sera era una emerita ca***ta! al massimo lo
split andava fatto su from\s per avere in $array[1] tutto cosa c'è dopo
from. Giusto? Scornando a destra e a manca alla fine forsa imparo qualcosa!
Però mi pare impossibile che non riesca a fare 'una cosa' del tipo:
"individua TUTTE le occorrenze di pattern su una riga e caricale (push) in
un array". mi carica sempre e solo la prima occorrenza.
ciao
stefano
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ORFN:Q0092 Q0092, Chr Mito from 35874-31814
__EOS__
# questa è la linea che ti serve
my @array = $string =~ /(\d+-\d+)/gm;
# questo è stato già spiegato
my @newarray =
reverse
map  { join '-', @$_ }
sort { $a->[0] <=> $b->[0] } #<- cifra che precede '-'
map  { [ split '-' ] }
@array;
print "@array\n";
print "@newarray\n";
--
________________________________________________________________________
"Cada niño es un artista. El problema es como quedarse artista despues de
crecer. (pablo picasso)"

entrambi?
L'operatore | è tale solo al di fuori di un gruppo; o, se preferisci, non è
un operatore, all'interno di un gruppo, ma un semplice carattere come
qualunque altro. Un gruppo contiene già un or implicito, sicché non è
necessario un simbolo per lo scopo.
Il problema del comportamento da te rilevato, però, non dipende tanto da
questo ma, credo, dalla presenza di \b. Così almeno, ad orecchio, mi
verrebbe da dire.
Ciao.

 my @array = $string =~ /(\d+-\d+)/gm;
Ri-grazie! adesso la versione beta9 della mia creatura funziona. Ho fatto un
po' di modifiche ai tuoi suggerimenti, e per ora mi interessava arrivare ad
avere @newarray.  'Pasto' di seguito il clou del codice. Sono graditi
commenti e critiche.
ciao e buon weekend a tutti.
stefano
#--IN e OUT sono già aperti--
while (!eof(IN)) {
$string=<IN>;
@array = $string =~ /(\b\d+-\d+\b)/gm;
push (@arrayy, @array);
print "@array\n";
}
my @newarray =
reverse
map  { join '-', @$_ }
sort { $a->[0] <=> $b->[0] }
map  { [ split '-' ] }
@arrayy;
print "\n@arrayy\n";
print "\n@newarray\n";
print OUT "\n@newarray\n";

cosa credi di fare con questo casino? :-)
    while (!eof(IN)) {
    $string=<IN>;
    @array = $string =~ /(\b\d+-\d+\b)/gm;
    push (@arrayy, @array);
    print "@array\n";
    }
guarda che basta che fai:
    $string = do{local $/;<IN>}
    @arrayy = $string =~ /\b(\d+-\d+)\b/gm;
ciao
--
________________________________________________________________________
"Whoever wrote the Ten Commandments made em short. They may not always be
kept but they can be understood. - Will Rogers"

     @arrayy = $string =~ /\b(\d+-\d+)\b/gm;
eh, eh! beata ignoranza! perň con il ciclo while č piů lesto in termini di
wallclock sec, soprattutto con file grossi !!!!
ciao
stefano

: però con il ciclo while è più lesto in termini di
: wallclock sec, soprattutto con file grossi !!!!
se devi avere in memoria TUTTO un file, poco importa se lo tiri su tutto di
un botto o una riga alla volta. Però è vero che a te serve solo avere i
(\d+-\d+) in memoria, quindi il while, risparmierebbe risorse. Allora basta
che lo scrivi così (senza il casino superfluo che ti piace tanto :-)
push @array, /\b(\d+-\d+)\b/g while <DATA>;
e il resto va come prima
my @newarray =
reverse
map  { join '-', @$_ }
sort { $a->[0] <=> $b->[0] } #<- cifra che precede '-'
map  { [ split '-' ] }
@array;
ciao
--
________________________________________________________________________
"Blind men don't bungi jump, it scares the dog too much."