2013-06-09 1 views
2

내가 JSON을 통해 루프를 시도하고있다 :

my $cards = $json_obj->decode($jsoncards->content); 
foreach my $card (@$cards) 
      { 
        print Dumper $card->{idMembers}; 
        if ($card->{idMembers} =~ $myid) 
        { 
          print $card->{name} . "\n"; 
        } 
      } 

인쇄 온보드 $ 카드의 출력 -> {idMembers}; is :

$VAR1 = [ 
     '50e442a195105cde670743e4', 
     '50fd66804825017002070285', 
     '50f71f02a30d2a8c0d07d10d' 
    ]; 

이러한 ID는 어떻게 비교합니까?

+0

루프 – Kevin

답변

0

바인드 연산자 =~은 LHS를 문자열로 처리하고 RHS를 패턴으로 처리합니다. 배열 참조의 문자열은 ARRAY(0x12ABF14)처럼 보이므로 유용하지 않습니다.

  1. grep EXPR, LIST 내장 :

    우리는 배열의 각 구성원에 대한 $myid에 맞게 두 가지 가능성이있다. 표현식이 true 값을 반환하는 모든 요소를 ​​선택합니다. 반환 된 항목 수가 1 개 이상이면 일치하는 요소를 찾았습니다.

    if (grep $myid eq $_, @{ $card->{idMembers} }) { do stuff } 
    # or: grep /\Q$myid/, ... if you don't want string equality 
    
  2. 부재-의 의미에서 smartmatch 연산자 ~~를 사용하여 (1)가 10.1도 사람 만 가능하다 :

    if ($myid ~~ $card->{idMembers}) { do stuff } 
    

    이 여러주의 주체이다. 따라서 smartmatch를 사용하는 코드는 적어도 use 5.010001이어야합니다. (2) Smartmatch는 최신 릴리스의 perl에서 실험용으로 다시 레이블되었으며 많은 통지없이 변경 될 수 있습니다. (3) idMembers 항목이 이 아니고 어레이 인 경우 smartmatch가 오류를 숨길 수 있습니다.

    스마트 매치는 두 피연산자의 유형에 따라 다릅니다. 하위 문자열로 $myid을 포함하는 모든 항목을 선택하려면이 항목을 정규식 개체로 전달해야합니다 (qr/\Q$myid/ ~~ ...). 그렇지 않으면 평등성을 테스트 할 가능성이 높습니다.

관련 문제