JSON в подсчете длины десериализации Perl не работает - PullRequest
1 голос
/ 21 февраля 2012

Как перебрать десериализованную строку json? Я не могу получить правильное количество значений прямо сейчас, оно не считается правильным.

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 ]

5 голосов
/ 21 февраля 2012

Вы получаете ссылку на массив, а не на массив. Вам необходимо разыменовать значение.

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

Более того, если вы хотите перебрать массив, вы можете просто использовать for

for (@$deserialize) { 
    # do stuff 
1 голос
/ 21 февраля 2012

Вы на самом деле работаете со ссылкой на результаты. Поскольку JSON может содержать все виды разных результатов, decode_json не будет возвращать список специально.

Так что вам нужно разыменовать переменную, которая у вас есть: $ deserialize

Кроме того, вы не хотите использовать функцию длины. Если вы напечатаете целочисленное значение (или скалярное значение) массива, он вернет его размер.

Итак, вот что вы хотите:

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

Это напечатает размер массива.

Если вы хотите просто начать работать с массивом, вы можете сделать:

my $list = request("http://localhost/getjson.php");                             
my $deserialize = from_json( $list );
my @json_array = @{$deserialize});
print scalar (@json_array);
1 голос
/ 21 февраля 2012

От perldoc -f длина :

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.

Вы не можете использовать length, чтобы узнать размер массива. Для этого воспользуйтесь советом выше.

Ваша ошибка дает вам ложное значение, потому что вы берете длину ссылки на массив, которая в строковом контексте будет выглядеть примерно так: ARRAY(0x22d0a88), которая в вашем случае казалась длиной в 13 символов. Например. эквивалент:

print length "ARRAY(0x22d0a88)";

В качестве любопытного примечания: если вы сделаете length(@array), он на самом деле вернет длину длины массива. Например. массив размером 16 вернет 2, потому что строка "16" имеет длину два символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...