Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Ordinamento

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    95

    Ordinamento

    ciao a tutti, ho appena visitato le pagine di perldoc.com relativamente all'ordinamento ... ma non riesco a terminare le operazioni di ordinamento:

    IL PROBLEMA: ho un DB di circa 200 record.
    Ogni record ha una ventina di campi.
    Io vorrei che i record ricercati dall'utente siano letti dal file DB e visualizzati in ordine alfabetico e descrescente tenendo come campi base i primi due (nome prodotto(ALFANUMERICO) e densità (NUMERICO));

    Le operazioni sull'array che si riferisce al campo mi riescono ma non riesco ad associarlo al riposizionamento ... i campi corrispondenti: praticamente mi si mescolano i campi di records diversi.

    Se qualcuno avesse un aiuto ....

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ma e` un problema di database (eventualmente quale?) o di sintassi Perl?

    Se e` l'ultimo occorre sapere dove stanno i vari campi una volta ricuperati dal database (quale struttura: matrice o hash o altro).
    Inoltre cosa usi per l'ordinamento? una routine default oppure una routine che ti sei fatto tu?

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    95
    Ciao Mich,
    il problema è nella sintassi perl!
    Hash e matrice non è la stessa cosa?

    Io pensavo che determinato un campo chiave potevo ordinare i record in base a quello.
    Ho utilizzato un codice (che poi magari ti pubblico) recuperato da perldoc.com ma mi fa l'ordinamento di tutti i campi del database senza associarli ad un singolo record ... non ti dico il casino!
    Ci devo lavorare ancora un attimo per capirne il meccanismo ... per poi lavorare sulla logica!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    > Hash e matrice non è la stessa cosa?

    No, sono due strutture completamente diverse.
    codice:
    %hash            # tutta la hash
    $hash{$elem}     # un elemento di una hash
    $hash{'pippo'}   # idem
    
    @array           # tutta la matrice (o vettore)
    $array[$cont]    # un elemento della matrice 
    $array[3]        # idem
    Per una cosa del tuo tipo, si puo` usare un vettore di hash, cioe` per ogni record riempi una hash, che poi salvi in una matrice.

    Ho avuto le mie belle difficolta` a capire questo, a suo tempo, ma poi e` una struttura estremamente flessibile.

    Ti consiglio un buon corso di Perl (ad esempio quello id HTML.it).

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    95
    Mich_ .... aiuto:

    open (DAT, "$db_file_name") || die "Non posso aprire $db_file_name: $!\n";

    LINE: while ($record = <DAT>) {
    chop ($record);
    $n_record++ ;
    @campo = split(/;/,$record);

    if (@FAM[$i] eq $campo[2]) {
    $numhits++; # Ma lo contiamo sempre!
    push (@hits, @campo);
    # @hits = sort{$hits{$a} <=> $hits{$b}} @hits;
    }
    }
    close (DAT);

    @hits contiene la stringa di dati che si ottiene quando risulta vero il confronto @FAM[$i] eq $campo[2].
    Non si può ordinare per campo vero?
    E' la strada corretta? Come proseguo per il confronto tra elementi di uno stesso campo?

    Sono arenato... mentalmente.
    Grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ci sono un paio di cose che non capisco nel tuo script:

    (@FAM[$i] eq $campo[2])
    Confronti un vettore con un elemento di un altro vettore?
    @FAM e` una matrice bidimensionale?


    push (@hits, @campo);
    Stai aggiungendo alla matrice @hits tutti i campi della matrice @campo? Non ti converrebbe tenere separato i vari campi?
    Se poi vuoi ordinare secondo uno solo dei campi, come fai a separarli?


    Nota che non sono molto bravo in Perl, per cui e` possibile che il tuo codice sia giusto (solo che io avevo un'idea diversa).

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    95
    @FAM è un vettore che contiene 10 elementi. Sulla base di un valore proveniente dal form, viene prelevato uno dei 10 valori che contiene @FAM e confrontato con il campo del DB $campo[2].

    Se questo si avvera dovrei prelevare il record (composto da 24 campi), inserirlo in una nuova matrice, ordinarla secondo un campo (es. il quinto $campo[5] e quindi visualizzarla ordinata.

    L'idea di tenere separati i campi (ossia fare 24 array) era venuta anche a me.... ma una volta ordinato il quinto array (per esempio) cioé effettuato l'ordinamento secondo il quinto campo... gli altri array non seguirebbero l'ordinamento del quinto array.

    Avrei una matrice ordinata per il quinto campo, ma non per i rimanenti 23.

    Dammi uno spunto! Non so come proseguire

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Quindi confermi che @FAM[$i] e` un errore: volevi scrivere $FAM[$i], cioe` l'elemento i-esimo della matrice

    Non devi fare 24 array, ma un'unica array in cui ogni elemento contiene TUTTI i campi del tuo record:
    al posto di push (@hits, @campo);
    devi scrivere (credo):
    $hits[@hits] = @campo;

    cioe` aggiungi un elemento alla matrice @hits e mettici dentro il riferimento alla matrice @campo.

    In pratica stai facendo una array di array.

    PS nota che come prima potrebbero esserci degli errori.

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Utente di HTML.it L'avatar di Kintaro
    Registrato dal
    Dec 2000
    Messaggi
    188
    L'ordinamento per campi di per se è semplice, però come ha fatto notare Mich_ il codice che hai postato ha confuso le idee non poco.

    Allora quello che penso di aver capito:
    - hai un file di testo con un record per riga
    - ogni riga ha 24 campi
    - tu vuoi stampare (o comunque ordinare in un array di array) i record ordinati per in campo #5, ma solo quelli che soddisfano la condizione campo #2 = un elemento di @FAM

    il codice sulla base di questo:


    open (DAT, "$db_file_name") || die "Non posso aprire $db_file_name: $!\n";
    while (<DAT>) {
    chomp;
    @campo = split /;/;
    push (@data, [@campo]) if $FAM[$i] eq $campo[2];
    }
    close (DAT);
    @sorted = sort { $a->[5] cmp $b->[5] } @data;
    print "@$_\n" foreach @sorted;
    Imparo! Imparo! Imparo!

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    95
    Provo subito... e doma mi faccio risentire per eventuali sviluppi.
    Grazie Michele

    PS sfrutto le tue conoscenze perché qui non c'è nessuno che possa aiutarmi!

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.