JSON字符串输入:https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo
我试图只返回哈希中的第一个键(当前日期),但一直无法这样做。我的代码如下所示
#!/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)'}{'2017-12-20'}{'1. open'};
如果我做这样的事情:
my ($open) = $decoded->{'Time Series (Daily)'};
print Dumper($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'
},
提前感谢您提供任何帮助,您可以提供菜鸟。
答案 0 :(得分:4)
您正在选择hashref键,而不是数组(顺序容器)元素。所以你不能索引但需要根据需要对键进行排序,因为哈希本质上是无序的。
使用您显示的确切格式,这将起作用
my $top = (sort { $b cmp $a } keys %{ $decoded->{'Time Series (Daily)'} } )[0];
say $decoded->{'Time Series (Daily)'}{$top}{'1. open'};
获取键列表,对它们进行反序排序(按字母顺序排列),并获取该列表的第一个元素。
如果您的日期时间格式可能有所不同,那么您需要在排序之前解析它。
如果你真的只想要最新的一个,那么这个效率很低,因为它会对整个列表进行排序。
答案 1 :(得分:4)
问题1:{
表示JSON对象的开始,该对象被解码为哈希。试图解散数组会失败。
问题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'};