我在编写Perl脚本时遇到了问题。操作和访问哈希散列的内容
这是任务:
我的代码工作正常,但有两个问题。
我想添加一个元素到散列
%grocery
,其中包含类别,品牌和价格。添加项目时,首先系统会要求提供该类别。如果该类别不存在,则会从用户添加新的类别,品牌和价格,但是如果该类别已经存在,那么它将采用用户的品牌名称和价格,并将其附加到现有类别。
当我尝试这样做时,它会清除先前存在的项目。我希望以前的项目添加新添加的项目。
此问题与最大值有关。查找给定哈希中的最大价格。我为此获得了垃圾价值。
我在做什么错?
这里是我的全码:
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);
你有没有被教过使用'given' /'when'?这是一个*实验*功能,所以它的功能可能会改变,或者在将来的Perl版本中可能会完全消失。最好避免它。 – Borodin
不要使用单字符变量名称,除非它们是像索引'$ i'或通用字符串'$ s'一样建立的。 '$ a'和'$ b'是保留的标识符,应该完全避免。 – Borodin
完成任务后,我建议您在[codereview.se]上发布它,然后我们会告诉您如何改进它。 – simbabque