2017-05-02 4 views
0

こんにちは私は以前にチェックされた条件に基づいて特定の配列項目にアクセスしたいと思います。私はここにコードを残して:その配列を生成した後でPerlの配列項目にアクセスする

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

+0

質問は何ですか?あなたのコードに何が間違っていますか? – ceving

+0

@ceving:OPは、$ valid_passが1である '$ pa'の値を見つけて、それを使ってそれ以上の情報を抽出できるようにします。 – Borodin

答えて

4

あなたforループが一度に二つのことをやっている:@$groupsMy::Model::Groupオブジェクトのリストを作成し、そのパスワード最初のボスを見つけますチェックアウトする。

は、私はあなたが2つの明確な操作にそれらを分割することを示唆している、とList::Utilモジュールfirstオペレータはここで、それがどのように見えるかだ2番目のタスク

に最適です。私はあなたがそのサイズをチェックする際に、アレイにscalarを適用する必要はありませんメソッドを繰り返し呼び出し

注意を避けるために、変数$bossesにメソッド呼び出し$boss->bossesの結果を抽出しました。 >とすべての他のコンパレータはとにかく

スカラーコンテキストを課す私はあなたの質問から私のコードの多くを撮影した、と私はあなたが$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 { 
     ...; 
    } 
} 
+1

ありがとう、これははるかに明確です。 – Albert

関連する問題