Как я могу хранить инвентарь, используя хеш Perl? - PullRequest
3 голосов
/ 20 марта 2010

Для выполнения задания в колледже мы должны создать скрипт на Perl, который позволит нам управлять запасами для интернет-магазина. (Примером был Amazon). Пользователи могут делать заказы в полностью текстовой среде, и инвентарь должен обновляться после завершения заказа.

Каждый предмет в инвентаре имеет от 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  

Ответы [ 4 ]

3 голосов
/ 20 марта 2010

Поскольку ваш курс предположительно не охватывает 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;
}

Надеюсь, это поможет вам начать работу.

1 голос
/ 20 марта 2010
#!/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
0 голосов
/ 20 марта 2010

Там много вопросов. Одним из простых является способ создания хешей, содержащих списки .

Нет хэша с двумя ключами, но хэши рады указать "влево и вправо", например:

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

тогда и только тогда, когда вы можете быть уверены, что у вас не будет диска под названием "DVD123". Использование двух хешей было бы безопаснее и более читабельно:

$inventory_by_title{$title} = ...
$inventory_by_code{$product_code} = ...
0 голосов
/ 20 марта 2010

вы можете использовать базу данных, такую ​​как sqlite , mysql и т. Д., Чтобы хранить данные инвентаризации вместо текстовых файлов. Затем вы можете использовать команды sql для запроса / обновления / удаления / выбора из базы данных и легко управлять данными инвентаризации

...