Domanda

Qualcuno può suggerire un buon modulo in perl che può essere usato per archiviare la raccolta di oggetti?

O ARRAY è un sostituto abbastanza buono per la maggior parte delle esigenze?

Aggiornamento: Sto cercando una classe di raccolte perché voglio essere in grado di eseguire un'operazione come calcolare la proprietà del livello di raccolta da ciascun elemento.

Dato che devo eseguire molte di queste operazioni, potrei anche scrivere una classe che può essere estesa da singoli oggetti. Questa classe funzionerà ovviamente con array (o potrebbe essere hash).

È stato utile?

Soluzione

Esistono moduli di raccolta per strutture più complesse, ma in Perl è comune utilizzare gli array per array, stack ed elenchi. Perl ha funzioni integrate per l'utilizzo dell'array come stack o elenco: push / pop, shift / unshift, splice (inserimento o rimozione nel mezzo) e il modulo foreach per l'iterazione.

Perl ha anche una mappa, chiamata hashmap che è l'equivalente di un dizionario in Python - che consente di avere un'associazione tra una singola chiave e un singolo valore.

Gli sviluppatori Perl spesso compongono queste due strutture di dati per creare ciò di cui hanno bisogno: hai bisogno di più valori? Memorizza i riferimenti di array nella parte del valore della tabella hash (Mappa). Gli alberi possono essere costruiti in modo simile: se hai bisogno di chiavi univoche, usa più livelli di hashmap o se non usi riferimenti di array nidificati.

Questi due tipi di raccolta primitivi in ??Perl non hanno un'API orientata agli oggetti, ma sono comunque raccolte.

Se guardi CPAN probabilmente troverai moduli che forniscono altre strutture di dati orientate agli oggetti, dipende davvero dalle tue necessità. C'è una particolare struttura di dati di cui hai bisogno oltre a un elenco, una pila o una mappa? Potresti ottenere una risposta più precisa (ad esempio un modulo specifico) se chiedi di una particolare struttura di dati.

Hai dimenticato di menzionare, se stai cercando piccoli esempi di codice in diverse lingue, PLEAC (Programmazione di esempi di linguaggio allo stesso modo Cookbook) è una risorsa decente.

Altri suggerimenti

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

my $record = get_complex_structure();
# $record = {
#    'widgets' => {
#        name => 'ACME Widgets',
#        skus => [ 'WIDG01', 'WIDG02', 'WIDG03' ],
#        sales => {
#            WIDG01 => { num => 25, value => 105.24 },
#            WIDG02 => { num => 10, value => 80.02 },
#            WIDG03 => { num => 8,  value => 205.80 },
#        },
#    },
#    ### and so on for 'grommets', 'nuts', 'bolts' etc.
# }

my @standouts =
    map { 

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

<*>

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

->[0] } sort { $b->[2] <=> $a->[2] || $b->[1] <=> $a->[1] || $record->{$a->[0]}->{name} cmp $record->{$b->[0]}->{name} } map { my ($num, $value); for my $sku (@{$record->{

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

<*>

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

}{skus}}) { $num += $record->{

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

<*>

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

}{sales}{$sku}{num}; $value += $record->{

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

<*>

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

}{sales}{$sku}{value}; } [

Vorrei commentare il commento di Michael Carman: per favore non usare il termine "Hashmap" o " map " quando intendi un hash o un array associativo. Soprattutto quando Perl ha una funzione cartografica; questo confonde semplicemente le cose.

Detto questo, la risposta di Kyle Burton è fondamentalmente sana: o un hash o un array, o una struttura complessa composta da una miscela dei due, di solito è sufficiente. Perl grugnisce OO, ma non lo applica; è probabile che una struttura di dati liberamente definita possa essere abbastanza buona per ciò di cui hai bisogno.

In caso contrario, definisci più esattamente cosa intendi con "calcola la proprietà a livello di raccolta da ciascun elemento". E tieni presente che Perl ha parole chiave come map e grep che ti consentono di fare cose di programmazione funzionale come ad esempio

<*>

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

, $num, $value ]; } keys %$record;

Leggendo da capo a piedi, questo particolare Transform Schwarztian fa tre cose:

3) Richiede una chiave per $ record, passa attraverso le SKU definite in questa struttura arbitraria e calcola il numero complessivo e il valore totale delle transazioni. Restituisce un array anonimo contenente la chiave, il numero di transazioni e il valore totale.

2) Il blocco successivo include un numero di array array e li ordina a) prima di tutto confrontando il valore totale, numericamente, in ordine decrescente; b) se i valori sono uguali, confrontando il numero di transazioni, numericamente in ordine decrescente; e c) in caso contrario, ordinando asciibeticamente il nome associato a questo ordine.

1) Infine, prendiamo la chiave per $ record dalla struttura di dati ordinati e restituiamo tale.

Può darsi che non sia necessario impostare una classe separata per fare ciò che desideri.

Normalmente userei un @array o un% hash.

Quali funzionalità stai cercando che non sono fornite da quelle?

Basa la tua decisione su come devi accedere agli oggetti. Se li spingi su un array, indicizzandoli, saltandoli / spostandoli, funziona, quindi usa un array. Altrimenti li hash per qualche chiave o li organizza in un albero di oggetti che soddisfa le tue esigenze. Un hash di oggetti è un modo molto semplice, potente e altamente ottimizzato di fare le cose in Perl.

Poiché le matrici Perl possono essere facilmente aggiunte, ridimensionate, ordinate, ecc., sono abbastanza buone per la maggior parte delle "raccolte". esigenze. Nei casi in cui hai bisogno di qualcosa di più avanzato, generalmente l'hash. Non consiglierei di andare a cercare un modulo di raccolta fino a quando non ne hai bisogno .

O un array o un hash possono memorizzare una raccolta di oggetti. Una classe potrebbe essere migliore se vuoi lavorare con la classe in determinati modi, ma dovresti dirci quali sono questi modi prima di poter dare qualche buon consiglio.

vorrei rimanere con un ARRAY o un HASH.

 @names = ('Paul','Michael','Jessica','Megan');

e

my %petsounds = ("cat" => "meow",
             "dog" => "woof",
             "snake" => "hiss");

source

Dipende molto; ci sono Sparse Matrix , alcune forme di persistenza , una nuovo stile di OO ecc Molte persone sono solo perldata , perllol , perldsc a rispondere al loro problema specifico con una struttura di dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top