Frage

Kann jemand ein gutes Modul in Perl vorschlagen, das zum Speichern einer Sammlung von Objekten verwendet werden kann?

Oder ist ARRAY ein ausreichend guter Ersatz für die meisten Anforderungen?

Aktualisieren:Ich suche nach einer Sammlungsklasse, weil ich in der Lage sein möchte, eine Operation wie die Berechnung der Sammlungsebeneneigenschaft für jedes Element durchzuführen.

Da ich viele solcher Operationen durchführen muss, kann ich auch eine Klasse schreiben, die um einzelne Objekte erweitert werden kann.Diese Klasse funktioniert offensichtlich mit Arrays (oder möglicherweise Hashes).

War es hilfreich?

Lösung

Es gibt Sammel Module für komplexere Strukturen, aber es ist üblich Stil in Perl Arrays zu verwenden, um Arrays, Stacks und Listen. Perl ist für die Verwendung der Anordnung als einen Stapel oder eine Liste in Funktionen eingebaut. Push / pop, Schiebe- / unshift, splice (Einsetzen oder Entfernen in der Mitte) zur Iteration und die foreach Form

Perl hat auch eine Karte, eine so genannte hashmap die die äquivalent zu einem Wörterbuch in Python ist -. So dass Sie eine Verbindung zwischen einem einzigen Schlüssel und einem einzelnen Wert haben

Perl-Entwickler komponieren oft diese beiden Daten-Strukturen zu bauen, was sie brauchen - brauchen mehrere Werte? Speicher-Array-Referenzen in dem Wert Teil der Hash-Tabelle (Karte). Bäume können in ähnlicher Weise aufgebaut werden. - wenn Sie eindeutige Schlüssel benötigen, mit mehreren Ebenen von Hashmaps verwenden, oder wenn Sie nicht verschachtelte Array Referenzen verwenden Sie

Diese beiden primitiven Sammlungstypen in Perl keine Object Oriented api haben, aber sie sind immer noch Sammlungen.

Wenn Sie auf CPAN aussehen werden Sie wahrscheinlich Module finden, die anderen objektorientierte Datenstrukturen zur Verfügung stellen, es hängt wirklich von Ihrem Bedarf. Gibt es eine bestimmte Datenstruktur benötigen Sie neben einer Liste, Stapel oder Karte? Sie könnten eine genauere Antwort (zB ein bestimmtes Modul), wenn man über eine bestimmte Datenstruktur ist zu fragen.

vergessen zu erwähnen, wenn Sie sich für kleine Code-Beispiele für eine Vielzahl von Sprachen suchen, Pléac (Programmiersprache Beispiele unter gleichen Bedingungen Kochbuch) ist eine anständige Ressource.

Andere Tipps

Ich würde Michael Carmans Kommentar unterstützen:Bitte verwenden Sie nicht den Begriff „Hashmap“ oder „Map“, wenn Sie einen Hash oder ein assoziatives Array meinen.Besonders wenn Perl eine Kartenfunktion hat;das bringt nur Verwirrung.

Dennoch ist die Antwort von Kyle Burton grundsätzlich vernünftig:Normalerweise reicht entweder ein Hash oder ein Array oder eine komplexe Struktur aus einer Mischung beider aus.Perl grokt OO, erzwingt es aber nicht;Die Chancen stehen gut, dass eine lose definierte Datenstruktur für Ihre Anforderungen ausreicht.

Sollte dies nicht der Fall sein, definieren Sie bitte genauer, was Sie unter „Eigenschaft der Sammlungsebene aus jedem Element berechnen“ verstehen.Und denken Sie daran, dass Perl über Schlüsselwörter wie „map“ und „grep“ verfügt, mit denen Sie funktionale Programmieraufgaben ausführen können, z. B.

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 { $_->[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->{$_}{skus}}) {
            $num   += $record->{$_}{sales}{$sku}{num};
            $value += $record->{$_}{sales}{$sku}{value};
        }
        [ $_, $num, $value ];
    }
    keys %$record;

Von hinten nach vorne gelesen, dieses besondere Schwarztianische Transformation macht drei Dinge:

3) Es benötigt einen Schlüssel für $record, geht die in dieser willkürlichen Struktur definierten SKUs durch und ermittelt die Gesamtzahl und den Gesamtwert der Transaktionen.Es gibt ein anonymes Array zurück, das den Schlüssel, die Anzahl der Transaktionen und den Gesamtwert enthält.

2) Der nächste Block nimmt eine Reihe von Arrayrefs auf und sortiert sie a) zunächst durch numerischen Vergleich des Gesamtwerts in absteigender Reihenfolge;b) wenn die Werte gleich sind, durch Vergleich der Anzahl der Transaktionen, numerisch in absteigender Reihenfolge;und c) falls dies fehlschlägt, durch asziibische Sortierung nach dem mit dieser Bestellung verknüpften Namen.

1) Schließlich entnehmen wir der sortierten Datenstruktur den Schlüssel für $record und geben ihn zurück.

Es kann durchaus sein, dass Sie keine separate Klasse einrichten müssen, um das zu tun, was Sie wollen.

Ich würde normalerweise ein @array oder einen% hash verwenden.

Welche Funktionen suchen Sie, die nicht von denjenigen zur Verfügung gestellt?

Basis Ihrer Entscheidung, wie müssen Sie auf die Objekte zugreifen. Wenn sie auf ein Array schieben, Indexieren in, Popping / Verschieben sie Arbeiten aus, dann einen Array verwenden. Hash sie sonst durch eine Taste oder organisieren sie in einen Baum von Objekten, die Ihren Bedürfnissen entspricht. Ein Hash von Objekten ist eine sehr einfache, leistungsfähige und hoch optimierte Art und Weise der Dinge in Perl zu tun.

Da Perl-Arrays können leicht an, der Größe verändert, sortiert angehängt werden, usw., sie sind gut genug für die meisten „Sammlung“ Bedürfnisse. In Fällen, in denen Sie etwas weiter fortgeschritten benötigen, wird ein Hash-Regel tun. Ich würde nicht empfehlen, dass Sie für eine Sammelmodul suchen gehen, bis Sie wirklich Notwendigkeit es.

entweder ein Array oder ein Hash kann eine Sammlung von Objekten speichern. Eine Klasse könnte besser sein, wenn Sie mit der Klasse in gewisser Weise arbeiten wollen, aber man müßte uns sagen, was diese Möglichkeiten sind, bevor wir irgendwelche gute Empfehlungen machen könnten.

Ich würde Stick mit einem Array oder einem HASH.

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

und

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

Quelle

Es hängt viel; gibt es Sparse Matrix Module, einige Formen von Ausdauer , ein neuer Stil der OO etc Die meisten Menschen Menschen nur perldata , perllol , perldsc beantworten ihr spezifisches Problem mit einer Datenstruktur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top