2017-12-21 1 views
1

JSON 문자열 입력 첫 번째 키를 반환 : 나는 해시 단지 첫 번째 키 (현재 날짜)을 반환하려고하지만 그렇게 할 수 없었다 https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demodecode_json 및 해시

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

#!/usr/bin/perl 

use strict; 
use warnings; 
use LWP::Simple; 
use Data::Dumper; 
use JSON; 

my $html = get("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AMD&apikey=CMDPTEHVYH7W5VSZ"); 

my $decoded = decode_json($html); 
my ($open) = $decoded->{'Time Series (Daily)'}->[0]->{'1. open'}; 

"ARRAY 참조가 아닙니다."계속 연구하고 혼란스러워했습니다.

나는 내가 무엇을 아래 코드로 직접 원하는 액세스 할 수 있지만, 난 그냥 첫 번째 결과 또는 현재 날짜에 액세스하려면 :

my ($open) = $decoded->{'Time Series (Daily)'}; 
print Dumper($open); 
: 또한

my ($open) = $decoded->{'Time Series (Daily)'}{'2017-12-20'}{'1. open'}; 

을 나는 같은 것을 할 경우

출력은 다음과 같습니다 :

$VAR1 = { 
     '2017-09-07' => { 
         '1. open' => '12.8400', 
         '5. volume' => '35467788', 
         '2. high' => '12.9400', 
         '4. close' => '12.6300', 
         '3. low' => '12.6000' 
         }, 
     '2017-11-15' => { 
         '3. low' => '10.7700', 
         '4. close' => '11.0700', 
         '2. high' => '11.1300', 
         '5. volume' => '33326871', 
         '1. open' => '11.0100' 
         }, 
     '2017-11-30' => { 
         '1. open' => '10.8700', 
         '2. high' => '11.0300', 
         '5. volume' => '43101899', 
         '3. low' => '10.7600', 
         '4. close' => '10.8900' 
         }, 

아무런 도움을 주셔서 감사합니다. 비.

+2

해시가 정렬되지 않았으므로 "첫 번째 키"가 없으므로 '-> [0]'을 할 수 없습니다. 아마도 최소한의 문자열을 찾아서 원하는 키를 찾아야 만 할 것입니다. – ysth

답변

4

배열 (순차적 컨테이너) 요소가 아니라 해시 키 중에서 선택합니다. 따라서 인덱스는 필요 없지만 필요에 따라 키를 정렬해야합니다. 해시는 본질적으로 순서가 지정되지 않았기 때문입니다. 정확한 형식으로

당신은 (알파벳 순)을 역은-정렬하고 그 목록의 첫 번째 요소를 가져 와서이

my $top = (sort { $b cmp $a } keys %{ $decoded->{'Time Series (Daily)'} })[0]; 
say $decoded->{'Time Series (Daily)'}{$top}{'1. open'}; 

그것은 키의 목록을 가져옵니다 작동 표시한다.

날짜 - 시간 형식이 다를 수있는 경우 정렬하기 전에 구문 분석해야합니다.

가장 최근의 것만 원한다면 전체 목록을 정렬하므로 비효율적입니다.

4

문제 1 : {은 해시로 디코딩 된 JSON 객체의 시작을 나타냅니다. 배열을 derefence하려고 시도하는 것은 실패 할 것입니다.

문제 2 : Perl 해시와 마찬가지로 JSON 개체의 순서가 지정되지 않으므로 "첫 번째 키"에 대해 이야기하는 것은 의미가 없습니다. 가장 최근의 날짜를 원하십니까?

use List::Util qw(maxstr); 

my $time_series_daily = $decoded->{'Time Series (Daily)'}; 
my $latest_date = maxstr @$time_series_daily; 
my $open = $time_series_daily->{$latest_date}{'1. open'};