Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl循环通过嵌套的hashref元素_Perl_Loops_Hashref - Fatal编程技术网

Perl循环通过嵌套的hashref元素

Perl循环通过嵌套的hashref元素,perl,loops,hashref,Perl,Loops,Hashref,我有一个类似于以下内容的perl数据结构: $VAR1 = bless( { 'admin' => '0', 'groups_list' => [ bless( { 'name' => undef,

我有一个类似于以下内容的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\u list”中的所有组,并检查其中是否有“webuser”groupid。感谢您的帮助


另外,请让我知道这是否可以不使用循环来完成。。类似于搜索字符串“groupid”=>“webuser”…

这将循环搜索并找到它:

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

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

这将循环并找到它:

foreach (@{$VAR1->{'groups_list'}})
{
    if ($_->{'groupid'} eq 'webuser')
    {
        print "found webuser.";
    }   
}
如果没有循环,就无法真正做到这一点,因为您的任务本质上涉及查看每个元素

祝福引用仅向其添加任意类型描述,并且不会以任何其他方式更改对其的使用,除非您使用重载,因此与未禁用的引用完全相同的循环将工作:

foreach my $group (@{$VAR1->{groups_list}}) {
   if ($group->{groupid} eq 'webuser') {
      # do stuff and break out
   }
}
如果只需要包含数组中没有索引的数据的内部哈希,也可以将循环替换为:

my @webusers = grep { $_->{groupid} eq 'webuser' } @{$VAR1->{groups_list}};
这将搜索整个列表。使用first from仅查找第一个匹配项。

祝福引用仅向其添加任意类型描述,并且不会以任何其他方式更改对其的使用,除非使用重载,因此与未禁用的引用完全相同的循环将起作用:

foreach my $group (@{$VAR1->{groups_list}}) {
   if ($group->{groupid} eq 'webuser') {
      # do stuff and break out
   }
}
如果只需要包含数组中没有索引的数据的内部哈希,也可以将循环替换为:

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

这将搜索整个列表。使用first from仅查找第一个匹配项。

由于组已被添加到包中,因此您可能不应该直接检查是否存在哈希键,而是向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' );

由于组已被添加到一个包中,因此您可能不应该直接检查哈希键的存在,而应该向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' );

有些东西必须循环散列以作为字符串转储,因此无论是在代码中还是在幕后,都会发生循环。有些东西必须循环散列以作为字符串转储,所以无论是在代码中还是在幕后,都会发生循环。除了破坏封装。@MkV,没有提到它是在类内还是类外使用。除了破坏封装之外。@MkV,没有提到它是在类内还是类外使用。