解码_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

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'};
我不断得到“非数组引用”,这让我更加困惑

我可以使用以下代码直接访问我想要的内容,但我只想访问第一个结果或当前日期:

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]
。您必须找出所需的键,可能需要找到最小字符串?