我有一个类似于以下的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'groupid。任何帮助表示赞赏。
另外,请告诉我是否可以在不使用循环的情况下完成此操作..比如搜索字符串'groupid'=> 'webuser' ..
答案 0 :(得分:5)
bless
引用仅向其添加任意类型描述,并且不会以任何其他方式更改它,除非您使用overload
,因此完全相同的循环将与无法使用的引用一起工作:
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
来查找第一个匹配项。
答案 1 :(得分:3)
这将循环并找到它:
foreach (@{$VAR1->{'groups_list'}})
{
if ($_->{'groupid'} eq 'webuser')
{
print "found webuser.";
}
}
如果没有循环,你不能真正做到这一点,因为你的任务固有地涉及查看每个元素。
答案 2 :(得分: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' );