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

print Dumper からの出力 $card->{idMembers}; は:

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

これらの ID と比較するにはどうすればよいですか?

4

1 に答える 1

0

bind オペレーター=~は、LHS を文字列として、RHS をパターンとして扱います。arrayref の文字列化は のようARRAY(0x12ABF14)に見えるため、これは役に立ちません。

$myid配列の各メンバーに対してを照合するには、次の 2 つの可能性があります。

  1. ビルトインgrep EXPR, LIST。式が true 値を返すすべての要素を選択します。返されたアイテムの数が 1 以上の場合、一致する要素が見つかりました。

    if ( grep $myid eq $_, @{ $card->{idMembers} }) { do stuff }
    # or: grep /\Q$myid/, ... if you don't want string equality
    
  2. メンバーの意味~~でスマートマッチ演算子を使用します。

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

    これには複数の注意事項があります: (1) v10.1 以降でのみ使用可能です。したがって、スマートマッチを使用するコードは少なくともuse 5.010001. (2) Smartmatch は perl の最新リリースで実験的なものとして再ラベル付けされており、予告なしに変更される可能性があります。(3)idMembersエントリが配列でない場合、スマートマッチはエラーを隠すことがあります。

    スマートマッチは、両方のオペランドのタイプによって異なります。部分文字列として含まれるすべてのエントリを選択する場合$myidは、おそらく正規表現オブジェクトとして渡す必要があります: qr/\Q$myid/ ~~ .... それ以外の場合は、同等性をテストする可能性があります

于 2013-06-09T17:52:06.493 に答える