Pregunta

Estoy buscando ayuda para comprender por qué JSON_DECODE devuelve un escalar en lugar de un hash.Todavía estoy aprendiendo Perl y una descripción o algo de referencia iluminada.sería genial.

por lo que las preguntas: ¿Por qué JSON_DECODE devuelve un escalar?(o no es un escalar) ¿Hay una mejor manera para que trabaje con los datos?

Aquí está mi código:

use strict;
use warnings;
use JSON qw(decode_json);
use LWP::UserAgent;

my $url = "http://api.bf4stats.com/api/playerInfo?plat=xbox&name=Ttylz00&output=json";

my $ua = LWP::UserAgent->new;
my $data = $ua->get($url);
my $json;
if($data->is_success){
    $json = decode_json($data->decoded_content);
}

&sData($json);

sub sData {
    my $data = $_[0];
    my $kdr = int($data->{stats}->{extra}->{kdr}*100)/100;
    printf "\nName: %s\nRank: %s, %s\nKDR: %s\n", $data->{player}->{name}, 
        $data->{player}->{rank}->{nr}, $data->{player}->{rank}->{name}, 
        $kdr;
}

¿Fue útil?

Solución

En Perl, una función solo puede devolver realmente una lista escalar o una lista.

Dado que los hashes se pueden inicializar o asignar de listas (por ejemplo, %foo = (a => 1, b => 2)), supongo que está preguntando por qué json_decode devuelve algo como { a => 1, b => 2 } (una referencia a un hash anónimo) en lugar de (a => 1, b => 2) (una lista que se puede copiar en un hash ).

Puedo pensar en algunas buenas razones para esto:

  • en Perl, una matriz o hash siempre contiene escalares. Por lo tanto, en algo así como { "a": { "b": 3 } }, la parte de { "b": 3 }, la parte tiene para ser un escalar; Y por consistencia, tiene sentido que todo el asunto sea un escalar de la misma manera.
  • Si el hash es bastante grande (muchas llaves en el nivel superior), es inútil y costoso de iterar sobre todos los elementos para convertirlo en una lista, y luego construir un nuevo hash de esa lista.
  • En JSON, el elemento de nivel superior puede ser un objeto (= perl hash) o una matriz (= matriz Perl). Si json_decode devolvió una lista en el caso anterior, no está claro qué volvería en este último caso. Después de decodificar la cadena JSON, ¿cómo podría examinar el resultado de saber qué hacer con él? (Y no sería seguro escribir %foo = json_decode(...) a menos que ya supiera que tenía un hash). Por lo que el comportamiento de json_decode funciona mejor para cualquier código de la biblioteca de propósito general que tenga que usarlo sin saber ya saber con los datos. .
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top