Frage

Ich suche Hilfe beim Verständnis, warum json_decode einen Skalar anstelle eines Hashs zurückgibt.Ich lerne immer noch Perl und eine Beschreibung oder eine Referenz.wäre großartig.

Also die Fragen:Warum gibt json_decode einen Skalar zurück?(Oder ist es kein Skalar) Gibt es einen besseren Weg für mich, mit den Daten zu arbeiten?

Hier ist mein Code:

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;
}
War es hilfreich?

Lösung

In Perl kann eine Funktion eigentlich nur einen Skalar oder eine Liste zurückgeben.

Da Hashes aus Listen initialisiert oder zugewiesen werden können (z. B. %foo = (a => 1, b => 2)), ich schätze, Sie fragen sich, warum json_decode gibt so etwas zurück wie { a => 1, b => 2 } (ein Verweis auf einen anonymen Hash) statt (a => 1, b => 2) (eine Liste, die in einen Hash kopiert werden kann).

Dafür fallen mir ein paar gute Gründe ein:

  • In Perl enthält ein Array oder Hash immer Skalare.Also in so etwas wie { "a": { "b": 3 } }, Die { "b": 3 } Teil hat ein Skalar sein;Und aus Gründen der Konsistenz ist es sinnvoll, dass das Ganze auf die gleiche Weise ein Skalar ist.
  • Wenn der Hash ziemlich groß ist (viele Schlüssel auf der obersten Ebene), ist es sinnlos und teuer, alle Elemente zu durchlaufen, um ihn in eine Liste umzuwandeln, und dann aus dieser Liste einen neuen Hash zu erstellen.
  • In JSON kann das Element der obersten Ebene entweder ein Objekt (= Perl-Hash) oder ein Array (= Perl-Array) sein.Wenn json_decode im ersteren Fall eine Liste zurückgegeben hat, ist nicht klar, was im letzteren Fall zurückgegeben werden würde.Wie können Sie nach der Dekodierung des JSON-Strings das Ergebnis untersuchen, um zu wissen, was damit zu tun ist?(Und es wäre nicht sicher zu schreiben %foo = json_decode(...) es sei denn, Sie wussten bereits, dass Sie einen Hash hatten.) Also json_decodeDas Verhalten funktioniert besser für jeden allgemeinen Bibliothekscode, der es verwenden muss, ohne bereits viel über die Daten zu wissen, mit denen es arbeitet.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top