Newsgroup: it.comp.lang.perl
Titolo: Espressioni reg.: COMPORTAMENTI ANOMALI; credete ai fantasmi??

Ciao tutti,
    ho davvero bisogno di un'idea. Ho un problema e per come potrete capire
NON e' un problema di debbug, o di errore di programmazione. Spero che
qualcuno di voi abbia riscontrato cose simili, in particolare se per caso
siete a conoscenza, o la vostra esperienza vi suggerisce, della possibilita'
di comportamenti totalmente anomali ed incongruenti nell'uso delle
espressioni regolari sotto questi due contesti:
1) in un programma relativamente lungo (circa 60 KB);
2) gestendo stringhe lunghe (decine di KB)
????
Io non so piu' cosa pensare! in un contesto come quello che vi  ho descritto
mi vengono fuori delle cose incredibili; se date un'ochiata a queste
semplici istruzioni
(la veriabile $temp contiene la pagina di risposta da un motore di un sito):
[...]
  $temp=~s/[\n\r\t]+//sg;
  $temp=~s/[\s]+/ /g;
[...]
   $cont=1;
   while(exists($info{'interesse_dvd'.$cont}) && $supporto eq "DVD"){
    @lista_interesse=$temp=~m/$info{'interesse_dvd'.$cont}/gis;
    @lista_interesse=$temp=~m/$info{'interesse_dvd'.$cont}/gis;
    $temp=join(' ',@lista_interesse);
    $cont=$cont+1;
   }
   $cont=1;
   while(exists($info{'interesse_vhs'.$cont}) && $supporto eq "VHS"){
    @lista_interesse=$temp=~m/$info{'interesse_vhs'.$cont}/gis;
    @lista_interesse=$temp=~m/$info{'interesse_vhs'.$cont}/gis;
    $temp=join(' ',@lista_interesse);
    $cont=$cont+1;
   }
ora vi dico le cose incredibili che capitano:
1) cadendo nel caso 1 (DVD) con una risposta ($temp) contenente una lista di
100 risultati (in HTML) non mi prende MAI il primo match (cerco degli <a
href ...
</a>) pur esistendo. Facendo copia-incolla delle stesse sole istruzioni
sopra riportate fuori da questo programma ed inizializzando la variablie
$temp manualmente con la risposta ricevuta (vi darei il programmino in
allegato. ma non posso postare qui allegati, non e' consentito) TUTTO
FUNZIONA, si prende dentro anche il primo match. Se
riduco il numero di riposte a 50 non cambia; se riduco il numero di risposte
a 30 non cambia; ma ATTENZIONE se riduco il numero di risposte a 30 E metto
come vedete DUE volte la stessa identica espressione regolare in un conetso
array  allora
funziona;
2) cadendo nel caso due (VHS) ... bhe' non fa NESSUN match ($temp diventa
vuota!) se c'e' una sola epsressione regolare. Invece li becca tutti se
metto due volte la stessa espressione regolare come sopra.
Io lo trovo INCREDIBILE. Voi che ne dite? Perdere tempo cosi' ... mi fa
veramente incavolare. Uno pensa di aver sbagliato tutto e poi guarda!
Ciao e grazie,
    Federico.

 ora vi dico le cose incredibili che capitano:
 
L'esito di un global pattern matching (m//g) è influenzato dal valore
corrente di pos() relativo allo scalare interessato.
Ad esmpio:
  $str = "anything";
  $rc = $str =~ m/a/g ;   # $rc vale 1
  $rc = $str =~ m/a/g ;   # $rc vale undef
  $rc = $str =~ m/a/g ;   # $rc vale di nuovo 1
In particolare, se pos($s) == length($s) il successivo m//g fallisce
sicuramente.
Sospetto che sia proprio questo comportamento dell'operatore di matching a
determinare le "stranezze" che hai riscontrato. Prova ad aggiungere un
 pos( $temp ) = 0;
subito prima di applicare la regexp.
Se ciò non bastasse, sarò felice di esaminare la versione completa del 
tuo script (che potrai se desideri inviarmi per email).
Ciao,
Max