문제

json_decode가 해시 대신 스칼라를 반환하는 이유를 이해하는 데 도움이 필요합니다.나는 아직도 Perl과 설명 또는 일부 참고 자료를 배우고 있습니다.좋을 것입니다.

그래서 질문은:json_decode가 스칼라를 반환하는 이유는 무엇입니까?(또는 스칼라가 아님) 데이터를 사용하는 더 좋은 방법이 있습니까?

내 코드는 다음과 같습니다.

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;
}
도움이 되었습니까?

해결책

Perl에서 함수는 실제로 스칼라나 리스트만 반환할 수 있습니다.

해시는 목록에서 초기화되거나 할당될 수 있으므로(예: %foo = (a => 1, b => 2)), 당신이 이유를 묻고 있는 것 같아요 json_decode 다음과 같은 것을 반환합니다 { a => 1, b => 2 } (익명 해시에 대한 참조)가 아닌 (a => 1, b => 2) (해시로 복사할 수 있는 목록)

이에 대한 몇 가지 좋은 이유를 생각해 볼 수 있습니다.

  • Perl에서는 배열이나 해시에 항상 스칼라가 포함됩니다.그래서 다음과 같은 것에서 { "a": { "b": 3 } }, { "b": 3 } 부분 가지다 스칼라가 되려면;일관성을 위해 모든 것이 같은 방식으로 스칼라가 되는 것이 합리적입니다.
  • 해시가 상당히 큰 경우(최상위 수준에 키가 많음) 모든 요소를 ​​반복하여 목록으로 변환한 다음 해당 목록에서 새 해시를 작성하는 것은 무의미하고 비용이 많이 듭니다.
  • JSON에서 최상위 요소는 객체(= Perl 해시) 또는 배열(= Perl 배열)일 수 있습니다.만약에 json_decode 전자의 경우 목록을 반환했지만 후자의 경우 무엇을 반환할지 확실하지 않습니다.JSON 문자열을 디코딩한 후 결과를 조사하여 어떻게 해야 할지 알 수 있습니까?(그리고 글을 쓰는 것은 안전하지 않을 것입니다. %foo = json_decode(...) 해시가 있다는 것을 이미 알고 있지 않은 한.) 그래서 json_decode의 동작은 작업 중인 데이터에 대해 아직 많이 알지 못한 채 이를 사용해야 하는 범용 라이브러리 코드에 더 잘 작동합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top