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


Автор: AlexanderI 13.2.2015, 13:52
Здравствуйте. Помогите правильно обьединить и создать хэш из другого хеша.

Есть такая структура (сделана через dump::dumper):
Каждый лист этого дерева расписан от корня.

Код


'$VAR1'=>[
        {
        'name'=>"Магазин",
        'val'=>"Универсам"                
        'sub'=>    [
                {
                 'name'=>"Товаров",
                 'val'=>"200"                
                 'sub'=>[
                        {
                        'name'=>"Сотрудников",
                        'val'=>"5"                
                        }    
                        ]
                }
                ]                        
        },
        {
        'name'=>"Магазин",
        'val'=>"Радуга"                
        'sub'=>    [
                {
                 'name'=>"Товаров",
                 'val'=>"300"                
                 'sub'=>[
                        {
                        'name'=>"Сотрудников",
                        'val'=>"10"                
                        }    
                        ]
                }
                ]                        
        },    
        {
        'name'=>"Ресторан",
        'val'=>"Ресторан 1"                
        'sub'=>    [
                {
                 'name'=>"Мест",
                 'val'=>"20"                
                 'sub'=>[
                        {
                        'name'=>"Сотрудников",
                        'val'=>"60"                
                        }    
                        ]
                }
                ]                        
        },
        {
        'name'=>"Ресторан",
        'val'=>"Ресторан 2"                
        'sub'=>    [
                {
                 'name'=>"Столов",
                 'val'=>"50"                
                 'sub'=>[
                        {
                        'name'=>"Сотрудников",
                        'val'=>"70"                
                        }    
                        ]
                }
                ]                        
        }                
        ]



Нужно совместить все уровни, чтобы не было повторений, верхних уровней. Чтобы получилось одно единственное дерево. Например имеется 2 одинаковых дерева "Магазин", всё что одинаковое обьединяется в массив.

Должно получиться что-то подобное:

[{
'name' => "Магазин",
'sub'  => [{
           'name' =>  'Универсам',
                     'sub' =>[{
                      .....
                     }]
            },
            {
           'name' =>  'Радуга',
                     'sub' =>[{
                   .......
                     }]
            },            
            ]
}]    

Автор: arto 13.2.2015, 14:23
сделайте сначала hash по name

Автор: AlexanderI 13.2.2015, 14:49
arto,  никак не могу придумать как.

Автор: arto 16.2.2015, 09:51
my $name = delete $_->{'name'};
$_->{'name'} = delete $_->{'val'};
push @{ $hh->{ $name } }, $_;

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