3 Stimmen

Wie kann ich ein Inventar unter Verwendung von Perl-Hashes speichern?

Für eine Aufgabe im College müssen wir ein Skript in Perl erstellen, das es uns ermöglicht, einen Bestand für einen Online-Shop zu verwalten. (Das Beispiel war Amazon). Benutzer können Bestellungen in einer rein textbasierten Umgebung aufgeben und der Bestand muss aktualisiert werden, wenn eine Bestellung abgeschlossen ist.

Jeder Artikel im Bestand hat 3 bis 4 Attribute: einen Produktcode, einen Titel, einen Preis und für einige einen Betrag (zum Beispiel haben MP3's dieses Attribut nicht).

Da dies meine erste Begegnung mit Perl ist, weiß ich nicht wirklich, wie ich anfangen soll. Mein Hauptproblem ist, wie ich den Bestand im Programm "implementieren" soll. Eine Funktion des Programms besteht darin, nach Titeln zu suchen. Eine andere ist das Aufgeben einer Bestellung, bei der der Benutzer einen Produktcode angeben sollte.

Meine erste Idee war ein Hash mit dem Produktcode als Schlüssel. Aber wenn ich in den Titeln suchen wollte, könnte das ein Problem sein wegen Folgendem: Der Hashkey wäre etwas wie DVD-123, die dazu gehörenden Informationen könnten "The Green Mask 12" (ohne Anführungszeichen) sein, wobei die 12 angibt, wie viele dieser DVDs derzeit auf Lager sind. Also müsste ich einen Weg finden, die 12 am Ende zu ignorieren.

Eine andere Lösung wäre, den Titel als Schlüssel zu verwenden, aber das wäre meiner Meinung nach auch umständlich.

Gibt es eine Möglichkeit, eine Hashtabelle mit 2 Schlüsseln zu erstellen, und wenn ich nur einen gebe, gibt sie ein Array mit den anderen Werten zurück? (Inklusive des anderen Schlüssels und der anderen Informationen) Auf diese Weise könnte ich je nach benötigten Informationen einen anderen Schlüssel aus meinem Bestand verwenden.

Wir müssen den Standardbestand aus einer Textdatei wie folgt einlesen:

MP3-72|Lady Gaga - Kiss and Run (Fear of Commitment Monster)|0.99  
CD-400|Kings of Leon - Only By The Night|14.50|2  
MP3-401|Kings of Leon - Closer|0.85  
DVD-144|Live Free or Die Hard|14.99|2  
SOFT-864|Windows Vista|49.95

3voto

rjh Punkte 47430

Da Ihr Kurs vermutlich kein SQL oder Datenbanken abdeckt, finden Sie es vielleicht nützlich, Ihren Bestand als Hash von Hashes darzustellen.

Bestandsgegenstände werden Hash Referenzen sein:

my $die_hard_4 = { code => 'DVD-144', title => 'Live Free or Die Hard', price => 14.99, stock => 2 };

Ihr Bestand selbst wird ein Hash sein:

my %inventory;
$inventory{'DVD-144'} = $die_hard_4;

Sie können einen weiteren Hash erstellen, um Ihren Bestand nach Titel zu indizieren:

my %inventory_by_title;
$inventory_by_title{'Live Free or Die Hard'} = $die_hard_4;

Alles, was noch bleibt, ist das Inventarformat in ein Hashref wie oben zu parsen. Als schnelles Beispiel:

my %inventory;
my %inventory_by_title;

while ( <> ) {   # für jede Eingabezeile
    chomp;  # Entferne Zeilenumbruch am Ende
    my ($code, $title), $price, $amount) = split /\|/;  # Aufteilen durch '|' Zeichen
    my $item = {
        code => $code,
        title => $title,
        price => $price,
        stock => $amount,
    };
    $inventory{$code} = $item;
    $inventory_by_title{$title} = $item;
}

Hoffentlich hilft Ihnen das, um anzufangen.

1voto

Sinan Ünür Punkte 114993
#!/usr/bin/perl

use strict; use warnings;
use YAML;

my @store;

while ( my $inv = <DATA> ) {
    chomp $inv;
    last unless $inv =~ /\S/;

    my ($id, $title, $price, $stock) = split qr{\|}, $inv;
    $stock ||= 0;
    my ($type, $code) = split /-/, $id;
    push @store, {
        type  => $type,
        code  => $code,
        title => $title,
        price => $price,
        stock => $stock,
    };
}

print "DVDs\n";
print Dump [ grep { $_->{type} eq 'DVD'} @store ];

print "Produkte, die weniger als \$15 kosten\n";
print Dump [ grep { $_->{price} < 15 } @store ];

print "Produkte, die auf Lager sind\n";
print Dump [ grep { $_->{stock} } @store ];

print "Produkte mit 'of' im Titel\n";
print Dump [ grep { $_->{title} =~ /of/ } @store ];

__DATA__
MP3-72|Lady Gaga - Kiss and Run (Fear of Commitment Monster)|0.99
CD-400|Kings of Leon - Only By The Night|14.50|2
MP3-401|Kings of Leon - Closer|0.85
DVD-144|Live Free or Die Hard|14.99|2
SOFT-864|Windows Vista|49.95

0voto

ghostdog74 Punkte 305138

Sie können eine Datenbank wie SQLite, MySQL usw. verwenden, um Ihre Lagerdaten anstelle von Textdateien zu speichern. Sie können dann SQL-Befehle verwenden, um Abfragen/Updates/Löschvorgänge/Auswahlen aus der Datenbank durchzuführen und Ihre Lagerdaten einfach zu bearbeiten

0voto

msw Punkte 41469

Da sind viele Fragen darin. Eine der einfachen ist, wie man Listen enthaltende Hashes erstellt.

Es gibt keinen Hash mit zwei Schlüsseln, aber Hashes zeigen gerne "nach links und rechts", zum Beispiel:

$inventory{$title} = $product_code;
$inventory{$product_code} = $title;

wenn und nur wenn Sie sicher sein können, dass Sie keine Disc mit dem Titel "DVD123" haben. Die Verwendung von zwei Hashes wäre sicherer und lesbarer:

$inventory_by_title{$title} = ...
$inventory_by_code{$product_code} = ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X