对于大学的作业,我们必须在Perl中创建一个脚本,允许我们管理电子商店的库存。 (给出的例子是亚马逊)。用户可以在完全基于文本的环境中下订单,并且在订单完成时必须更新库存。
广告资源中的每件商品都有3到4个属性:产品代码,标题,价格以及某些金额(例如MP3没有此属性)
由于这是我第一次遇到Perl,我真的不知道如何开始。我的主要问题是如何“实施”程序中的库存。该程序的一个功能是搜索标题。另一种是订单,用户应该提供产品代码。
我的第一个想法是将产品代码作为密钥的哈希。但是如果我想搜索可能因此问题的标题: 该密钥类似于DVD-123,属于该密钥的信息可以是“绿色掩模12”(没有引号),其中12表示该DVD当前有多少库存。所以我必须找到一种方法来忽略最终的12。
另一种解决方案是使用标题作为关键,但我认为这也很麻烦。
有没有办法用2个键创建一个哈希表,当我只给一个哈希表时,它返回一个包含其他值的数组? (包括其他密钥和其他信息) 这样我可以根据我的库存中需要的信息使用另一个密钥。
我们必须从文本文件中读取默认库存,如下所示:
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
答案 0 :(得分:3)
由于您的课程可能不包括SQL或数据库,因此您可能会发现将广告资源表示为hash of hashes非常有用。
库存物品将是哈希参考:
my $die_hard_4 = { code => 'DVD-144', title => 'Live Free or Die Hard', price => 14.99, stock => 2 };
您的广告资源本身就是一个哈希:
my %inventory;
$inventory{'DVD-144'} = $die_hard_4;
您可以创建另一个哈希来按标题索引您的广告资源:
my %inventory_by_title;
$inventory_by_title{'Live Free or Die Hard'} = $die_hard_4;
剩下的就是将库存文件格式解析为如上所述的hashref。作为一个简单的例子:
my %inventory;
my %inventory_by_title;
while ( <> ) { # for each line of input
chomp; # remove trailing newline
my ($code, $title, $price, $amount) = split /\|/; # split by '|' character
my $item = {
code => $code,
title => $title,
price => $price,
stock => $amount,
};
$inventory{$code} = $item;
$inventory_by_title{$title} = $item;
}
希望这有助于您开始使用。
答案 1 :(得分:1)
#!/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 "Products that cost less than \$15\n";
print Dump [ grep { $_->{price} < 15 } @store ];
print "Products that are in stock\n";
print Dump [ grep { $_->{stock} } @store ];
print "Products with 'of' in the title\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
答案 2 :(得分:0)
您可以使用sqlite,mysql等数据库来存储库存数据而不是文本文件。然后,您可以使用sql命令从数据库中查询/更新/删除/选择并轻松操作库存数据
答案 3 :(得分:0)
那里有很多问题。其中一个简单的方法是如何制作hashes containing lists。
没有带有两个键的哈希,但是哈希很乐意指向“向左和向右”,例如:
$inventory{$title} = $product_code;
$inventory{$product_code} = $title;
当且仅当您可以确定您没有标题为“DVD123”的光盘时。使用两个哈希将更安全,更可读:
$inventory_by_title{$title} = ...
$inventory_by_code{$product_code} = ...