Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    confrontare due array di hash

    Ciao a tutti,
    ho un problema con il confronto di due array composti da hash referenziati

    array1[hash1,hash3,hash5,hash7]
    array2[hash1,hash5]

    tutti gli hash sono composti così

    hash{"nn_ini"->valore, "nn_fin"->valore, "codice"->valore, "seq"->valore}

    i valori contenuti nelle chiavi di alcuni hash possono essere identici (es. valori hash1 di array1= valori hash1 di array2)

    mi serve di stampare i valori delle hash contenute in array1 che non compaiono in array2

    per fare questo ho fatto un doppio foreach ecco il codice:

    foreach my$glimm(@array1){
    foreach my $ncbi (@array2){

    if (($$glimm{"nn_ini"}==$$ncbi{"nn_ini"})&&($$glimm{" nn_fin"}==$$ncbi{"nn_fin"})){
    print FILE ">",";",$$glimm{"nn_ini"},";",$$glimm{"nn_fin"},"; ",$$ncbi{"codice"},"\n",$$glimm{"seq"},"\n";
    }

    elsif (($$glimm{"nn_ini"}==$$ncbi{"nn_ini"})&&($$glimm{" nn_fin"}!=$$ncbi{"nn_fin"})){
    print FILE ">",";",$$glimm{"nn_ini"},";",$$glimm{"nn_fin"},"; ",$$ncbi{"codice"},";","first_codon","\n",$$glimm{ "seq"},"\n";
    }

    elsif (($$glimm{"nn_ini"}!=$$ncbi{"nn_ini"})&&($$glimm{" nn_fin"}==$$ncbi{"nn_fin"})){
    print FILE ">",";",$$glimm{"nn_ini"},";",$$glimm{"nn_fin"},"; ",$$ncbi{"codice"},";","last_codon","\n",$$glimm{" seq"},"\n";
    }

    elsif(($$glimm{"nn_ini"}!=$$ncbi{"nn_ini"})&&($$gl imm{"nn_fin"}!=$$ncbi{"nn_fin"})){
    print ">",$$glimm{"nn_ini"},";",$$glimm{"nn_fin"},"\n",$ $glimm{"seq"},"\n";
    next;
    }
    }

    }

    l'ultimo elsif mi da problema, entra in loop...

    ho anche provato a sostituirlo con un else e togliere le condizioni, pensando che dovrebbe stampare tutto il resto non compreso nelle condizioni iniziali invece niente, sempre loop

    potete aiutarmi?
    grazie 1000

  2. #2
    tieni presente che l'operatore di confronto "==" o "!=" in Perl si usa solo per i numeri, per le stringhe si usa "eq" e "ne".

    il "next;" alla fine dell'ultimo elsif è inutile in quanto in ogni caso farebbe un altro ciclo se vi sono elementi rimanenti nell'array.

    Infine non capisco cosa intendi quando dici che l'ultimo eslif va in loop !?!?!?

    come fa un if o elsif ad andare in loop?
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    si, uso gli operatori == e != perchè sono dei numeri

    il next l'ho tolto ma il problema persiste

    loop l'ho usato forse in modo improprio, se faccio scrivere un file questo è di oltre 6Gb!! e ad aprirlo c'è solo la prima riga vuota
    se faccio stampare sul terminale non si ferma più...

  4. #4
    Come vengono costruiti gli array 1 e 2?
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  5. #5
    Gli array vengono costruiti con un push, leggendo due file differenti dove uno è un sottoinsieme dell'altro, prendendo le informazioni tramite espressione regolare, assegnata ad un hash reference e push dell'hash nell'array

    l'array1 è una lista di coordinate, l'arrary2 è anche lui una lista più piccola di coordinate le quali sono tutte presenti anche nell'array1

    esempio

    array1[hash1,hash2,hash3,hash4,hash5]
    array2[hash2,hash3,hash5]

  6. #6
    un ciclo infinito può accadere in genere con while e for, poichè ciclano fino a che la condizione posta è vera, e quindi se per un errore logico del programmatore non si presenta mai il "false" vanno avanti.

    invece foreach si gestisce da solo, infatti smette di ciclare nel momento che finiscono gli elementi dell'array, per cui il fatto che un loop abbia un comportamento del genere può essere dovuto solo a due cause:

    - gli array sono giganteschi
    - da qualche parte del blocco foreach c'è un comando "redo" che fa reiniziare il tutto.

    Propendo per la prima ipotesi.

    Ti consigli di controllare la dimensione degli array tramite

    print $#array1 . "\n";
    print $#array2 . "\n";
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  7. #7
    Gli array contengono rispettivamente:
    4159
    5405
    dove l'array più piccolo è un sottoinsieme di quello più grande...

    Come mai non riesce a trovare gli elementi (in questo caso hash) che non hanno nessuna delle 2 chiavi uguali?

  8. #8
    in questo pezzo di codice:

    codice:
    elsif(($$glimm{"nn_ini"}!=$$ncbi{"nn_ini"})&&($$glimm{"nn_fin"}!=$$ncbi{"nn_fin"})){
    print ">",$$glimm{"nn_ini"},";",$$glimm{"nn_fin"},"\n",$$glimm{"seq"},"\n";
    next;
    }
    dopo il print manca l'indicazione del filehandle, per cui i risultati di questa opzione non vengono scritti sul file.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  9. #9
    si, l'avevo tolto per vedere sul terminale la stampa poichè non riuscivo ad aprire il file che è troppo grande

  10. #10
    Problema risolto...
    era una questione di logica e ogni key di ciascun array venive iterata troppe volte
    ho risolto lavorando sul FILEHANDLE e sostituendo i valori quando c'erano match delle 2 key o solo di una delle due, facendo così non vado a toccare i valori quando le due key sono entrambe differenti....

    Grazie comunque per l'interessamento....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.