解码_json并返回散列中的第一个键
JSON字符串输入: 我试图只返回散列中的第一个键(当前日期),但无法返回。我的代码如下所示解码_json并返回散列中的第一个键,json,perl,Json,Perl,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=CMDPTEHVYH7
#!/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'};
我不断得到“非数组引用”,这让我更加困惑
我可以使用以下代码直接访问我想要的内容,但我只想访问第一个结果或当前日期:
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'
},
提前感谢您提供的任何帮助 您是在hashref键中拾取,而不是在数组(顺序容器)元素中拾取。因为散列本身是无序的,所以不能索引到该列表中,但需要根据需要对键进行排序 用你展示这部作品的确切格式
my $top = (sort { $b cmp $a } keys %{ $decoded->{'Time Series (Daily)'} } )[0];
say $decoded->{'Time Series (Daily)'}{$top}{'1. open'};
它获取键列表,对它们进行逆排序(按字母顺序),并获取该列表的第一个元素
如果日期时间格式可能不同,则需要对其进行解析以进行排序
如果你真的只想要最近的一个,这是低效的,因为它会对整个列表进行排序。然后使用更具体的工具仅提取“最大”元素,如
use List::Util qw(reduce);
my $top = reduce { $a gt $b ? $a : $b }
keys %{ $decoded->{'Time Series (Daily)'} };
但是在您的例子中,这可以通过来自同一模块的
maxstr
来完成,如ikegami的回答所示。另一方面,如果datetime格式不适合由strmax
使用的直接词典比较,则reduce
允许使用自定义比较。您在hashref键中选择,而不是在数组(顺序容器)元素中选择。因为散列本身是无序的,所以不能索引到该列表中,但需要根据需要对键进行排序
用你展示这部作品的确切格式
my $top = (sort { $b cmp $a } keys %{ $decoded->{'Time Series (Daily)'} } )[0];
say $decoded->{'Time Series (Daily)'}{$top}{'1. open'};
它获取键列表,对它们进行逆排序(按字母顺序),并获取该列表的第一个元素
如果日期时间格式可能不同,则需要对其进行解析以进行排序
如果你真的只想要最近的一个,这是低效的,因为它会对整个列表进行排序。然后使用更具体的工具仅提取“最大”元素,如
use List::Util qw(reduce);
my $top = reduce { $a gt $b ? $a : $b }
keys %{ $decoded->{'Time Series (Daily)'} };
但是在您的例子中,这可以通过来自同一模块的
maxstr
来完成,如ikegami的回答所示。另一方面,如果datetime格式不适合由strmax
使用的直接词典比较,则reduce
允许使用自定义比较。问题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'};
问题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'};
散列没有顺序,因此它们没有“第一个键”,您不能对它们执行
->[0]
操作。您必须找出您想要的键,也许可以找到最小字符串?散列没有顺序,因此它们没有“第一个键”,您不能执行->[0]
。您必须找出所需的键,可能需要找到最小字符串?