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

绑定运算符=~将其 LHS 视为字符串,将 RHS 视为模式。arrayref 的字符串化看起来像ARRAY(0x12ABF14),所以这没有用。

我们有两种可能性来匹配$myid数组的每个成员:

  1. grep EXPR, LIST内置的。选择表达式返回真值的所有元素。如果返回项的计数≥1,则找到匹配元素。

    if ( grep $myid eq $_, @{ $card->{idMembers} }) { do stuff }
    # or: grep /\Q$myid/, ... if you don't want string equality
    
  2. ~~成员含义中使用 smartmatch 运算符:

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

    这需要注意多个警告:(1) 它仅在 v10.1 之后可用。因此,使用 smartmatch 的代码至少应该use 5.010001. (2) Smartmatch 在最新版本的 perl 中被重新标记为实验性的,并且可能会在没有太多通知的情况下进行更改。(3) 如果idMembers条目不是数组,smartmatch 可能会隐藏错误。

    智能匹配取决于两个操作数的类型。如果要选择包含$myid作为子字符串的所有条目,则应该将其作为正则表达式对象传递:qr/\Q$myid/ ~~ .... 否则,它可能会测试是否相等

于 2013-06-09T17:52:06.493 回答