1

我有一个类似于以下的 perl 数据结构:

$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”组ID。任何帮助表示赞赏。

另外,请让我知道是否可以在不使用循环的情况下完成此操作。例如搜索字符串'groupid' => 'webuser' ..

4

3 回答 3

5

blessing reference 仅向其添加任意类型描述,并且不会以任何其他方式更改使用它,除非您使用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}};

不过,这将搜索整个列表。使用firstfromList::Util仅查找第一个匹配项。

于 2012-10-18T12:21:41.010 回答
3

这将循环并找到它:

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

如果没有循环,您将无法真正做到这一点,因为您的任务本质上涉及查看每个元素。

于 2012-10-18T12:20:38.653 回答
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' );
于 2012-10-18T20:23:49.513 回答