生成该数组后访问Perl中的数组项

时间:2017-05-02 09:44:16

标签: perl mojolicious

您好我想基于先前检查过的条件访问特定的数组项。我把代码保留在这里:

elsif (scalar(@{$boss->bosses}) > 1) {
  foreach my $pa (@{$boss->bosses}) {
    my $p = My::Model::Group->new(id => $pa->group_id);
    push(@$groups, $p);
    $valid_pass = 1 if ($pa->checkPassword($self->param('password')));
  }  
  if ($valid_pass) {    
    my $pa_id = $pa->id;
    my $pa_partner_id = $pa->group_id;
  }
  else {
  }
}

我想要做的是,如果在数组中,我检查密码是否正确,那么如果它是正确的,那么我想获取数组项的id和group_id在函数中使用它以便能够登录它们。

1 个答案:

答案 0 :(得分:4)

您的for循环同时执行两项操作:在My::Model::Group中生成@$groups个对象的列表,并找到其密码签出的第一个老板。

我建议您将它们分成两个清晰的操作,List::Util模块first运算符是第二个任务的理想选择

这是它的样子。我已将方法调用$boss->bosses的结果提取到变量$bosses中,以避免重复调用该方法

请注意,在检查数据大小时,您不需要将scalar应用于数组。 >和所有其他比较器无论如何强加了标量上下文

我已从您的问题中删除了大部分代码,我有点担心您为$pa_id$pa_partner_id提取值,然后将其丢弃。但我想你知道你真正想做什么

use List::Util 'first';

my $bosses = $boss->bosses;

if ( ... ) {
    ...;
}
elsif ( @$bosses > 1 ) {

    @$groups = map { My::Model::Group->new( id => $_->group_id ) } @$bosses;

    my $password = $self->param( 'password' );
    my $pa       = first { $_->checkPassword( $password ) } @$bosses;

    if ( $pa ) {    
        my $pa_id         = $pa->id;
        my $pa_partner_id = $pa->group_id;
    }
    else {
        ...;
    }
}