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

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}};

ただし、これによりリスト全体が検索されます。firstfromを使用しList::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

グループはパッケージに bless されているため、ハッシュ キーの存在を直接確認するのではなく、次のように 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 に答える