perl中的多级hash-ref

perl中的多级hash-ref,perl,hash,Perl,Hash,我想迭代下面的多级hash ref,并想创建父->子关系以及拖放功能。下面是我从dumper获得的hash ref。因此我想创建一个节并显示所有父和子关系信息,在其中我只能将子元素拖放到其父元素中,还可以拖放每个父元素以更改显示顺序。但我的首要任务是正确显示父->子关系 散列如下: my $hash = { '4' => { 'forumid' => '136720', 'childre

我想迭代下面的多级hash ref,并想创建父->子关系以及拖放功能。下面是我从dumper获得的hash ref。因此我想创建一个节并显示所有父和子关系信息,在其中我只能将子元素拖放到其父元素中,还可以拖放每个父元素以更改显示顺序。但我的首要任务是正确显示父->子关系

散列如下:

my $hash  = {
          '4' => {
                   'forumid' => '136720',
                   'children' => {
                                   '7' => {
                                            'forumid' => '136997',
                                            'title' => 'under category',
                                            'is_category' => '0',
                                            'parentid' => '136720'
                                          }
                                 },
                   'title' => 'Android',
                   'is_category' => '0',
                   'parentid' => '-1'
                 },
          '1' => {
                   'forumid' => '136666',
                   'children' => {
                                   '5' => {
                                            'forumid' => '136954',
                                            'children' => {
                                                            '8' => {
                                                                     'forumid' => '137004',
                                                                     'title' => 'child of child',
                                                                     'is_category' => '0',
                                                                     'parentid' => '136954'
                                                                   }
                                                          },
                                            'title' => 'add child',
                                            'is_category' => '0',
                                            'parentid' => '136666'
                                          }
                                 },
                   'title' => 'Main Forum',
                   'is_category' => '0',
                   'parentid' => '-1'
                 },
          '3' => {
                   'forumid' => '136719',
                   'title' => 'Nokia C2-01',
                   'is_category' => '1',
                   'parentid' => '-1'
                 },
          '2' => {
                   'forumid' => '136665',
                   'children' => {
                                   '6' => {
                                            'forumid' => '136994',
                                            'children' => {
                                                            '9' => {
                                                                     'forumid' => '137012',
                                                                     'title' => 'another child',
                                                                     'is_category' => '0',
                                                                     'parentid' => '136994'
                                                                   }
                                                          },
                                            'title' => 'sub form under test forum',
                                            'is_category' => '0',
                                            'parentid' => '136665'
                                          }
                                 },
                   'title' => 'test',
                   'is_category' => '0',
                   'parentid' => '-1'
                 }
        };
<div id='136666'>Main Forum
    <div>
        <a href='136954'>add child</a>, <a href='137004'>child of child</a>
    </div>
</div>
<div id='136665'>test
    <div>
        <a href='136994'>sub form under test forum</a>, <a href='137012'>another child</a>
    </div>  
</div>
<div id='136719'>Nokia C2-01
    <div id='136720'>Android
        <div>
            <a href='136997'>under category</a> 
        </div>  
    </div>  
</div>
我需要我的输出如下:

my $hash  = {
          '4' => {
                   'forumid' => '136720',
                   'children' => {
                                   '7' => {
                                            'forumid' => '136997',
                                            'title' => 'under category',
                                            'is_category' => '0',
                                            'parentid' => '136720'
                                          }
                                 },
                   'title' => 'Android',
                   'is_category' => '0',
                   'parentid' => '-1'
                 },
          '1' => {
                   'forumid' => '136666',
                   'children' => {
                                   '5' => {
                                            'forumid' => '136954',
                                            'children' => {
                                                            '8' => {
                                                                     'forumid' => '137004',
                                                                     'title' => 'child of child',
                                                                     'is_category' => '0',
                                                                     'parentid' => '136954'
                                                                   }
                                                          },
                                            'title' => 'add child',
                                            'is_category' => '0',
                                            'parentid' => '136666'
                                          }
                                 },
                   'title' => 'Main Forum',
                   'is_category' => '0',
                   'parentid' => '-1'
                 },
          '3' => {
                   'forumid' => '136719',
                   'title' => 'Nokia C2-01',
                   'is_category' => '1',
                   'parentid' => '-1'
                 },
          '2' => {
                   'forumid' => '136665',
                   'children' => {
                                   '6' => {
                                            'forumid' => '136994',
                                            'children' => {
                                                            '9' => {
                                                                     'forumid' => '137012',
                                                                     'title' => 'another child',
                                                                     'is_category' => '0',
                                                                     'parentid' => '136994'
                                                                   }
                                                          },
                                            'title' => 'sub form under test forum',
                                            'is_category' => '0',
                                            'parentid' => '136665'
                                          }
                                 },
                   'title' => 'test',
                   'is_category' => '0',
                   'parentid' => '-1'
                 }
        };
<div id='136666'>Main Forum
    <div>
        <a href='136954'>add child</a>, <a href='137004'>child of child</a>
    </div>
</div>
<div id='136665'>test
    <div>
        <a href='136994'>sub form under test forum</a>, <a href='137012'>another child</a>
    </div>  
</div>
<div id='136719'>Nokia C2-01
    <div id='136720'>Android
        <div>
            <a href='136997'>under category</a> 
        </div>  
    </div>  
</div>
下面是创建哈希的函数:

     sub subforumsTree {
    my $forums = shift; 
    my $pid = shift || ('-1' || '0');
    my $HASH;   
    foreach my $forum ( @{$forums}){
        #next if ($forum->{is_category});           
        if($forum->{parentid} eq $pid){
            $HASH->{$forum->{displayorder}} = {forumid=>$forum->{forumid},parentid=>$forum->{parentid},title=>$forum->{title},is_category=>$forum->{is_category}};  
            my $children =  &subforumsTree( $forums,$forum->{forumid} );
            if( $children ) {
               $HASH->{$forum->{displayorder}}->{'children'} = $children;
            }
        }
    }

     return $HASH;
}

here is the function which I tried for displaying elements:
sub adminforumsList {

    my $hash = shift;
    my $options = '';
    my $iter; 
    $iter = sub {
        my $hash = shift;
        my $indent = shift || '';
        foreach my $k (sort keys %{$hash}) {  
            my $v = $hash->{$k};
                        $options .= "<div id=cat_".$v->{forumid}." class=isDraggable>
                        <div class='col_buttons right' style='white-space: nowrap'>
                        <ul class='ipsControlStrip'>
                        <li class='i_add'>
                        <a href='#' title='New Forum...'>New Forum...</a>
                        </li>
                        <li class='i_edit'>
                        <a href='#' title='Edit Settings...'>Edit Settings...</a>
                        </li>
                        <li class='ipsControlStrip_more ipbmenu' id='menum-26'>
                        <a href='#'>Options</a>
                        </li>
                        </ul>
                        <ul class='acp-menu' id='menum-26_menucontent' style='display: none'>
                        <li class='icon info'><a href='#'>Permissions...</a></li>
                        <li class='icon delete'><a href='#'>Delete Category...</a></li>
                        <li class='icon edit'><a href='#'>Edit as Forum...</a></li>
                        <li class='icon view'><a href='#'>Skin Options...</a></li>
                        </ul>
                        </div><div class='draghandle'>&nbsp;</div>
                        <div class='item_info'>
                        <img src='/images/icons/folder.png' />
                        &nbsp;&nbsp;<strong class='larger_text'>$v->{title}</strong>                
                        </div>";
                        $options .= "<div id='cat_wrap_".$v->{forumid}. "' class='item_wrap'>";
                        $options .= "<div class='item ipsControlRow isDraggable' id='forum_".$v->{forumid}."'>";
                        $options .= "<table style='width: 100%'>
                        <tr>
                        <td style='width: 20px !important; vertical-align: top;'>
                            <div class='draghandle'>&nbsp;</div>
                        </td>
                        <td style=''>
                            <div class='item_info'>
                                <strong class='forum_name'>$v->{title}</strong>
                                <br />
                                <span class='desctext'>$v->{description}</span>
                            </div>
                            </td>                           
                        </tr>
                        </table></div></div></div>";

            if ($v->{children}){
                $iter->($v->{children}, $indent . "--");
            }
        }
    };
    $iter->($hash);
    return $options;
}
子流程{
我的$forums=shift;
我的$pid=shift | |('-1'| |'0');
我的$HASH;
foreach my$forum(@{$forums}){
#下一个if($forum->{is_category});
if($forum->{parentid}eq$pid){
$HASH->{$forum->{displayorder}}={forumid=>$forum->{forumid},parentid=>$forum->{parentid},title=>$forum->{title},is_category=>$forum->{is_category};
我的$children=&subflumstree($forums,$forum->{forumid});
if(儿童){
$HASH->{$forum->{displayorder}}->{'children'}=$children;
}
}
}
返回$HASH;
}
以下是我尝试用于显示元素的函数:
副行政官名单{
我的$hash=shift;
我的$options='';
我的$iter;
$iter=sub{
我的$hash=shift;
我的$indent=shift | |“”;
foreach my$k(排序键%{$hash}){
my$v=$hash->{$k};
$options.=”
$v->{title} "; $options.=”; $options.=”; $options.=” $v->{title}
$v->{description} "; 如果($v->{children}){ $iter->($v->{children},$indent.“--”); } } }; $iter->($hash); 返回$options; }
您没有展示您尝试过的内容,并且您的问题也不清楚,这可能意味着您的问题将被关闭

我不会为你做太多的编程,但我建议你考虑一下

每个论坛都可以是一个对象,其中一个字段可以是其他论坛的散列。如果您已经了解了有关引用的知识,那么编程OO Perl就不难了。通过将每个论坛定义为论坛类的一个成员,您可以消除对散列操作的棘手部分

我还建议你把你的问题分解成更小的部分。一旦掌握了代码的基本知识,就可以添加拖放操作。是否要输出XML?现在还不清楚你想做什么。如果只想存储结构,可以使用。如果你把它传递给你的论坛结构,它将把整个结构存储在一个文件中,你就可以把它读回。对于这些类型的任务,Storable比XML更容易使用,而且它是一个标准模块


然而,若您必须使用XML格式,那个么您应该使用Perl中可用的许多示例之一,因为您的示例还不是自一致的,可以简化—回答您的问题不需要大量数据。例如,您的HTML在诺基亚C2-01中包含Android,但在散列中并非如此。另外,您是否可以更清楚地了解如何解析子元素的子元素-您似乎希望将它们展平,并且只显示一个深度级别,对吗?最后,您尝试了什么Perl代码?实际上,散列键是显示顺序键,如1、2、3和4,我必须按此顺序显示所有元素,所以如果我们将其与Android分开,这并不重要。首先,我使用了一个使用递归的函数作为下拉列表,但我必须改变我的方法,并像上面提到的那样显示它。试着自己编写一些东西,如果它不起作用,请将它带给我们以帮助您。你开始,我们帮助。我们不是为你写的。向我们展示您尝试过的实际代码,然后我们可以从中帮助您。如果你先亲自尝试,你很可能会非常接近答案。是的,请参见上文,首先创建散列的函数。感谢您的建议,但以前我使用递归函数在下拉列表中显示相同的论坛列表,但现在我必须根据上述需要更改方法。@RituSingh
$hash->{$forum->{displayorder}}={forumid=>$forum->{forumid},parentid=>$forum->{parentid},title=>$forum->{title},is_category=>$forum->{is_category}您必须实际维护它。你会发现,将论坛定义为一个对象将使其成为一个