json_decode가 스칼라를 반환하는 이유는 무엇입니까?
문제
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
의 동작은 작업 중인 데이터에 대해 아직 많이 알지 못한 채 이를 사용해야 하는 범용 라이브러리 코드에 더 잘 작동합니다.
제휴하지 않습니다 StackOverflow