doujunchi1238
doujunchi1238
2012-02-21 00:56
浏览 49

perl反序列化长度计数中的json不起作用

How do iterate through a deserialized json string? I can't get the right number of values right now it doesn't count right.

my $list = request("http://localhost/getjson.php");                             
my $deserialize = from_json( $list );
print Dumper($deserialize);
$VAR1 = [
          'ab',
          'cc',
          'de',
          'aer',
          'ffe',
          'cer',
          'dad',
          'efef',
          'afaf',
          'ege',
          'grsc',
          'cegg',
          'cegg',          
          'cegg/aaa.html',
          'eggt',
          'ttt'
        ];
print length($deserialize);
13 ?? it should say 16
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • douhua1890
    douhua1890 2012-02-21 01:01
    已采纳

    You are getting back an array reference not an array. You need to dereference the value.

    my @array = @$deserialize; # or @{ $deserialize }
    print scalar @array;
    

    Moreover, if you want to iterate over the array you can just use for

    for (@$deserialize) { 
        # do stuff 
    
    点赞 评论
  • dongliu8559
    dongliu8559 2012-02-21 01:04

    From perldoc -f length:

    This function cannot be used on an entire array or hash to find
    out how many elements these have.  For that, use "scalar
    @array" and "scalar keys %hash", respectively.
    

    You cannot use length to find out the size of an array. To do that, use the advice above.

    Your bug gives you a false value because you are taking the length of the array reference, which in string context will be something like ARRAY(0x22d0a88), which in your case seemed to be 13 characters long. E.g. the equivalent of:

    print length "ARRAY(0x22d0a88)";
    

    As a curious side note, if you would do length(@array), it will actually return the length of the length of the array. E.g. an array of size 16 would return 2, because the string "16" is two characters long.

    点赞 评论
  • douji0073
    douji0073 2012-02-21 01:06

    You are actually working with reference to the results. Since JSON can contain all sorts of different results, decode_json won't return a list specifically.

    So you need to dereference the variable that you have: $deserialize

    Additionally, you don't really want to be using the length function. If you print the integer value (or scalar value) of an array, it will return it's size.

    So here's what you want:

    my $list = request("http://localhost/getjson.php");                             
    my $deserialize = from_json( $list );
    print scalar (@{$deserialize});
    

    That will print the size of the array.

    If you want to just start by working with an array you can do:

    my $list = request("http://localhost/getjson.php");                             
    my $deserialize = from_json( $list );
    my @json_array = @{$deserialize});
    print scalar (@json_array);
    
    点赞 评论

相关推荐