Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > структура данных


Автор: alyam 9.1.2007, 11:52
Помогите разобраться. Упрощенно эта задачка выглядит так:
данные в файле находятся в таком виде:
<канцтовары>                ручка гелевая           <инв. номер>
<комплектующие>         HDD 200Mb           <инв. номер>
<канцтовары>                карандаш HB           <инв. номер>

можно использовать шаблон s/^\<(.*?)\>\s+(.*?)  \</

необходимо вывести на экран:
склад№1 - ручка гелевая
склад№1 - карандаш
склад№2 - HDD 200Mb
канцтовары на складе№1, комплектующие на складе№2
какую структуры данных использовать? хеш ?

Автор: amg 9.1.2007, 12:08
Что такое "склад" и откуда берется его номер?

Автор: alyam 9.1.2007, 12:26
всего 2 скалада. на одном хранятся канцтовары, на втором комплектующие.
как уже говорил я упростил задачу.
на самом деле встречаются не только канцтовары и комплектующие....например есть 
<бумага>                 указывается ее тип и т.д. <инв. номер>
получается $1 - элемент набора данных (массива)
склад№ - это зависимость от содержимого в  $1
и $2 каким то образом надо связать, чтобы вывести. сложновато для меня  smile 
условимся, что с $1 можно связать только одно значение $2...

Автор: shootnix 9.1.2007, 12:43
Да можно не просто хеш, а хеш хешей или хеш хешей массивов.

Код

my $sklad1 = { 
    'ручка гелевая' => '<инв. номер>',
    'карандаш HB'   => '<инв. номер>'
 };

my $sklad2 = { ... };

my $main_hash = { 'склад№1' => $sklad1, 'склад№2' => $sklad2 };

# ну и ...

print $main_hash->{склад№1}->{ручка гелевая};


Можно так. Можно воспользоваться модулем стандартным Class::Struct чтобы было удобнее и сподручнее создавать структуры, соответственно, perldoc в помощь.

Можно всяк, в общем :-)

Автор: alyam 9.1.2007, 12:49
нельзя так написать print $main_hash->{склад№1}->{ручка гелевая};
откуда я знаю что надо вывести именно гелевую ручку?
print должен вывести все элементы хеша или хеша хешей перебирая их...

Автор: amg 9.1.2007, 12:53
Ну, я бы сделал массив хэшей хэшей. Индекс массива - номер склада, ключ первого хэша - категория товара (канцтовары, комплектующие), ключи второго хэша - сами товары, значения - инв. номера. Такая структура несколько избыточна, если на каждом складе только одна категория товаров, зато последнее условие становится необязательным.

Автор: alyam 9.1.2007, 12:57
инв номера вообще нипричем. не вижу как массив хешей хешей решает задачу.

Автор: shootnix 9.1.2007, 13:09
Согласен, массив делать удобнее, работать с ним приятнее :-)
Кто, собственно, мешает перебирать хеш хешей или массив хешей?

Код

for my $line ( @ary ) {
    # $line - ссылка на хеш, номер склада или как там...
    while ( ($key, $val) = each ( %{ $line } ) {
        print $key, $val
    }



Да вариантов масса. Непонятно только, что конкретно нужно сделать с данными, цель какая? Как выводить, что выводить? Может, лучше воспользоваться БД?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)