Ich habe Probleme mit dem Schreiben eines Perl-Skripts.Manipulieren und auf den Inhalt eines Hashes von Hashes zugreifen
Dies ist die Aufgabe:
Mein Code funktioniert gut, aber hat zwei Probleme.
Ich möchte
%grocery
ein Element zu dem Hash hinzuzufügen, die Kategorie, Marke und Preis enthält. Wenn Sie den Artikel hinzufügen, fragt das System zuerst nach der Kategorie.Wenn die Kategorie nicht existiert, wird eine neue Kategorie, Marke und Preis vom Benutzer hinzugefügt, aber wenn die Kategorie bereits existiert, wird der Markenname und Preis vom Benutzer genommen und an die existierende Kategorie angehängt .
Wenn ich versuche, löscht es die bereits vorhandenen Elemente. Ich möchte die vorherigen Elemente mit dem neu hinzugefügten Element angehängt haben.
Dieses Problem tritt mit dem Maximalwert auf. Um den maximalen Preis in dem gegebenen Hash zu finden. Ich bekomme dafür einen Müllwert.
Was mache ich falsch?
Hier ist mein vollständiger Code:
use strict;
use warnings;
use List::Util qw(max);
use feature "switch";
my $b;
my $c;
my $p;
my $highest;
print "____________________________STORE THE ITEM_____________________\n";
my %grocery = (
"soap" => { "lux" => 13.00, "enriche" => 11.00 },
"detergent" => { "surf" => 18.00 },
"cleaner" => { "domex" => 75.00 }
);
foreach my $c (keys %grocery) {
print "\n";
print "$c\n";
foreach my $b (keys %{ $grocery{$c} }) {
print "$b:$grocery{$c}{$b}\n";
}
}
my $ch;
do {
print "________________MENU_________________\n";
print "1.ADD ITEM\n";
print "2.SEARCH\n";
print "3.DISPLAY\n";
print "4.FIND THE MAX PRICE\n";
print "5.EXIT\n";
print "enter your choice \n";
$ch = <STDIN>;
chomp($ch);
given ($ch) {
when (1) {
print "Enter the category you want to add";
$c = <STDIN>;
chomp($c);
if (exists($grocery{$c})) {
print "Enter brand\n";
$b = <STDIN>;
chomp($b);
print "Enter price\n";
$p = <STDIN>;
chomp($p);
$grocery{$c} = { $b, $p };
print "\n";
}
else {
print "Enter brand\n";
$b = <STDIN>;
chomp($b);
print "Enter price\n";
$p = <STDIN>;
chomp($p);
$grocery{$c} = { $b, $p };
print "\n";
}
}
when (2) {
print "Enter the item that you want to search\n";
$c = <STDIN>;
chomp($c);
if (exists($grocery{$c})) {
print "category $c exists\n\n";
print "Enter brand\n";
$b = <STDIN>;
chomp($b);
if (exists($grocery{$c}{$b})) {
print "brand $b of category $c exists\n\n";
print "-----$c-----\n";
print "$b: $grocery{$c}{$b}\n";
}
else {
print "brand $b does not exists\n";
}
}
else {
print "category $c does not exists\n";
}
}
when (3) {
foreach $c (keys %grocery) {
print "$c:\n";
foreach $b (keys %{ $grocery{$c} }) {
print "$b:$grocery{$c}{$b}\n";
}
}
}
when (4) {
print "\n________________PRINT HIGHEST PRICED PRODUCT____________________\n";
$highest = max values %grocery;
print "$highest\n";
}
}
} while ($ch != 5);
Haben Sie gelernt, 'gegeben'/'wann' zu verwenden? Es ist eine * experimentelle * Funktion, daher kann sich ihre Funktion ändern oder in zukünftigen Versionen von Perl ganz verschwinden. Es ist am besten, es zu vermeiden. – Borodin
Verwenden Sie keine single-character Variablennamen, es sei denn, sie sind etablierte wie $ i für einen Index oder $ s für eine generische Zeichenfolge. '$ a' und' $ b' sind reservierte Identifikatoren und sollten vollständig vermieden werden. – Borodin
Sobald Sie mit Ihrer Aufgabe fertig sind, schlage ich vor, dass Sie es bei [codereview.se] veröffentlichen und wir sagen Ihnen, wie Sie es verbessern können. – simbabque