3

大学での課題のために、e ストアの在庫を管理できるスクリプトを Perl で作成する必要があります。(与えられた例はAmazonでした)。ユーザーは完全にテキストベースの環境で注文を行うことができ、注文が完了すると在庫を更新する必要があります。

インベントリ内のすべてのアイテムには、3 ~ 4 つの属性があります。製品コード、タイトル、価格、および一部の金額 (たとえば、MP3 にはこの属性がありません)。

これが Perl との初めての出会いなので、どうやって始めればよいのかよくわかりません。私の主な問題は、プログラムでインベントリをどのように「実装」するかです。プログラムの機能の 1 つは、タイトルを検索することです。もう 1 つは、ユーザーが製品コードを指定して注文する方法です。

私の最初のアイデアは、プロダクトコードをキーとするハッシュでした。しかし、これが原因で問題になる可能性のあるタイトルを検索したい場合: ハッシュキーは DVD-123 のようなものになり、そのキーに属する情報は "The Green Mask 12" (引用符なし) で、12 が示す場合この DVD の現在の在庫数。したがって、最終的に 12 を無視する方法を見つける必要があります。

別の解決策は、タイトルをキーとして使用することでしたが、それも面倒だと思います。

2 つのキーを持つハッシュ テーブルを作成する方法はありますか?1 つだけを指定すると、他の値を持つ配列が返されますか? (他のキーと他の情報を含む)そうすれば、インベントリから必要な情報に応じて別のキーを使用できます。

次のようなテキスト ファイルからデフォルトのインベントリを読み取る必要があります。

MP3-72|レディー・ガガ - Kiss and Run (Fear of Commitment Monster)|0.99  
CD-400|キングス・オブ・レオン - オンリー・バイ・ザ・ナイト|14.50|2  
MP3-401|キングス オブ レオン - クローザー|0.85  
DVD-144|自由に生きるか死ぬか|14.99|2  
SOFT-864|Windows Vista|49.95  
4

4 に答える 4

3

コースはおそらくSQLまたはデータベースを対象としていないため、インベントリをハッシュのハッシュとして表すと便利な場合があります。

インベントリアイテムはハッシュ参照になります:

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;

残っているのは、インベントリファイル形式を上記のようなハッシュ参照に解析することだけです。簡単な例として:

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;
}

これがあなたが始めるのに役立つことを願っています。

于 2010-03-20T13:01:33.963 に答える
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
于 2010-03-20T13:47:15.540 に答える
0

テキストファイルの代わりに、 sqlite、mysqlなどのデータベースを使用してインベントリデータを保存できます。次に、SQLコマンドを使用して、データベースからクエリ/更新/削除/選択し、インベントリデータを簡単に操作できます。

于 2010-03-20T12:43:49.657 に答える
0

そこにはたくさんの質問があります。簡単な方法の1つは、リストを含むハッシュを作成する方法です。

2つのキーを持つハッシュはありませんが、ハッシュは「左向きと右向き」を指して喜んでいます。たとえば、次のようになります。

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

「DVD123」というタイトルのディスクがないと確信できる場合に限ります。2つのハッシュを使用すると、より安全で読みやすくなります。

$inventory_by_title{$title} = ...
$inventory_by_code{$product_code} = ...
于 2010-03-20T12:56:35.080 に答える