2012-10-18 21 views
1

我有类似如下的Perl数据结构:Perl的环通嵌套祝福hashref元素

$VAR1 = bless({ 
       'admin' => '0', 
       'groups_list' => [ 
              bless({ 
                'name' => undef, 
                'groupid' => 'canedit', 
                'description' => 'Can Edit Articles' 
                }, 'group_entry'), 
              bless({ 
                'name' => undef, 
                'groupid' => 'webuser', 
                'description' => 'Can Access Content' 
                }, 'group_entry'), 
             ], 
       'trusted' => '1', 
       }, 'user_info'); 

我在“groups_list”寻找一种方式来环通所有的团体和检查,如果我们有' webuser'groupid。任何帮助表示赞赏。

另外,请让我知道,如果这可以在不使用循环..像搜索的字符串做“组识别符号” =>“WEBUSER” ..

+1

某些东西将不得不循环哈希以字符串形式转储,因此无论是在您的代码还是在幕后,循环都将发生。除了破解封装外,其余的都是 – vol7ron

回答

5

bless荷兰国际集团仅供参考添加任意类型说明它并不会改变以任何其他方式使用它,除非你使用overload,所以完全一样环与unblessed引用将工作:

foreach my $group (@{$VAR1->{groups_list}}) { 
    if ($group->{groupid} eq 'webuser') { 
     # do stuff and break out 
    } 
} 

你也可以用grep代替循环,如果你只在阵列需要的数据散列内没有他们的指标:

my @webusers = grep { $_->{groupid} eq 'webuser' } @{$VAR1->{groups_list}}; 

这虽然搜索整个列表。从List::Util使用first只能找到第一个匹配项。

+0

。 – MkV

+0

@MkV,没有提到它是否会在班级内外使用。 –

3

这将遍历并发现它:

foreach (@{$VAR1->{'groups_list'}}) 
{ 
    if ($_->{'groupid'} eq 'webuser') 
    { 
     print "found webuser."; 
    } 
} 

如果没有循环,你不能真正做到这一点,因为你的任务固有地涉及到每个元素。

0

由于集团一直在祝福成一个包,你可能不应该直接检查哈希键的存在,而不是添加一个方法到group_entry类这样的(类似的东西可能已经存在):

{ 
    package group_entry; 
    sub get_groupid { 
    my $self = shift; 
    $self->{groupid} 
    } 
} 

而且由于你的数据也祝福到USER_INFO包,创建USER_INFO的方法通过GROUPID过滤组(您USER_INFO类可能已经有这样的事):

{ 
    package user_info; 
    sub get_groups_list { 
    my $self = shift; 
    return @{ $self->{groups_list} } 
    } 
    sub filter_groups_by_groupid { 
    my $self = shift; 
    my ($filter_groupid) = @_; 
    return grep { $_->get_groupid eq $filter_groupid } $self->get_groups_list 
    } 
} 

,并在你的代码,做类似于:

my @webusers = $data->filter_groups_by_groupid('webuser');