Newsgroup: it.comp.lang.perl
Titolo: matchare uno scalare in un array

Ciao,
chi puo' aiutarmi a trovare un metodo migliore del seguente per vedere
se un qualsiasi campo di @$records contiene $result->{'ID'} ? Io ho
(brillantemente) aggirato il problema cosi' :)
foreach $_(@$result) {$tutti_records .= $_->{'ID'};}
    for $_(@$records) {
        push(@$new_records,$_) if ($tutti_records !~ m/$_/);
        }
ciao e grazie
Mattia




Non mi sembra una soluzione. Cosa succede se un nuovo ID matcha a cavallo
tra due ID esistenti? Un falso allarme, ovviamente.
Inoltre mettere esplicitamente $_ come indice del for/foreach e' poco
funzionale (leggi "Funziona, ma a me fa schifo da vedere" :)
Dobbiamo, come bonus, cercare di interpretare il tuo codice per capire che
problema vuoi risolvere e quale e' la tua struttura dati, perche'
probabilmente il tuo e' un segreto industriale e non ti potevi permettere di
spiegare il problema in maniera esplicita.
Siccome ho tempo da perdere, vediamo se ho capito cosa cerchi di fare.
- $result e' un reference ad un array di reference ad hash.
  Di fatto hai un array di hash.
- $tutti_records e' quindi uno stringone che contiene la concatenazione di
  tutti gli ID (di cui ci e' proibito conoscere il fantomatico formato).
 
- @$records e' un array, forse di identificatori.
- @$new_records e' un altro array (di cui hai il reference... sarai mica
  dentro una subroutine, eh?) com tutti gli elementi di @$records che, in
  qualche maniera casuale, riescono a matchare OVUNQUE nella concatenazione 
  degli ID di $result.
 
Quindi $result e' un array di hash. Tu vuoi sapere contiene elementi con 
campo ID tra quelli elencati in @$records (che non e' proprio la domanda che
fai all'inizio del messaggio...) o meglio identificare gli elementi che non
sono contenuti...
La cosa che posso pensare e' che gli ID dell'hash siano unici... ma allora,
perche' non usare un hash di hash e non un array di hash? In effetti,
dipende da cosa ci devi fare con i dati... ma sei sicuro che la struttura
sia adeguata?
Taglio la testa al toro e scelgo la via piu' scema, non molto diversa dalla
tua, ma probabilmente corretta 
 for (@$results) { $elenco_id{$_->{'ID'}}++; }
 for (@$records)
  {
    push (@$new_records, $_) unless exists $elenco_id{$_};
  }
Se invece di usare @$results tu avessi usato un hash di hash con chiave ID,
avresti potuto ridurre il tutto a
 
 for (@$records)
  {
    push (@$new_records,$_) unless exists $results->{$_};
  }
Naturalmente, tutto il codice riportato non e' stato provato, in mancanza di
materiale sul quale verificarne la correttezza.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 materiale sul quale verificarne la correttezza.
Grazie comunque mi e' stato molto utile !!
Ciao 
Mattia


 	}
Il problema e' che @$records non e' un blocco unico di dati e non e' un tipo
di dati primitivo. Poi in questo codice l'array contiene tutto il record,
non l'ID, quindi hai cambiato struttura dati.
La soluzione migliore mi sembra essere quella di avere gli ID 'sottomano'
per verificare l'esistenza di un elemento in un hash, sia usando l'hash di
hash (se non ti serve che i tuoi record siano ordinati) o con l'hash
ausiliario se sei costretto ad usare l'array di hash.
