在perl中循环从XDB::HTTP返回的数据结构

在perl中循环从XDB::HTTP返回的数据结构,perl,influxdb,Perl,Influxdb,尝试从值中取出值对 my $influx = InfluxDB::HTTP->new(host => 'localhost', port => 8086); my $query = 'SELECT mean(value) FROM db1.autogen.num1,db1.autogen.num2 WHERE time > now() - 1h GROUP BY time(1s) LIMIT 20'; my $res = $influx->query([$quer

尝试从值中取出值对

my $influx = InfluxDB::HTTP->new(host => 'localhost', port => 8086);
my $query = 'SELECT mean(value) FROM db1.autogen.num1,db1.autogen.num2 WHERE time > now() - 1h GROUP BY time(1s) LIMIT 20';

my $res = $influx->query([$query], epoch => 's',);
print $res;
我得到的结果是:

Returned data: {"results":[{"statement_id":0,"series":[{"name":"num1","columns":["time","value"],"values":[[1550842812,114.098],[1550842812,114.084],[1550842812,114.07],[1550842812,114.055],[1550842812,114.041],[1550842813,114.027],[1550842813,114.012],[1550842813,113.998],[1550842813,113.984],[1550842813,113.969],[1550842814,113.955],[1550842814,113.941],[1550842814,113.926],[1550842814,113.911],[1550842814,113.897],[1550842815,113.883],[1550842815,113.868],[1550842815,113.854],[1550842815,113.84],[1550842815,113.825]]},{"name":"num2","columns":["time"│ ,"value"],"values":[[1550842812,11.358],[1550842812,11.373],[1550842812,11.388],[1550842812,11.402],[1550842812,11.416],[1550842813,11.431],[1550842813,11.445],[1550842813,11.459],[155084│ 2813,11.474],[1550842813,11.488],[1550842814,11.502],[1550842814,11.517],[1550842814,11.531],[1550842814,11.545],[1550842814,11.56],[1550842815,11.575],[1550842815,11.589],[1550842815,11.│ 604],[1550842815,11.618],[1550842815,11.632]]}]}]}
但是当我做一个

print $res->{results};

Object returned by call to InfluxDB::HTTP::query() at test.pl line 10 can't be used as <HASH> at test.pl line 12.
打印$res->{results};
在test.pl第10行调用InfluxDB::HTTP::query()返回的对象不能像在test.pl第12行那样使用。
看起来像个杂烩,但不是吗?有关于如何使用数据结构的提示吗


调用InfluxDB::HTTP::query()返回的对象。。。不能使用,因为
提示
$res
是一个对象。查看允许对对象执行哪些操作以访问其数据。

文档中有一节标题为:

Object::Result
依赖于从子例程返回数据

我想,如果这是一个指向文档的链接,或者包含更好的使用返回对象的示例,那么会更有帮助

但是看看源代码,我看到结果对象是这样创建的:

result {
    raw         { return $response; }
    data        { return $data; }
    results     { return $data->{results}; }
    request_id  { return $response->header('Request-Id'); }
    <STR>       { return "Returned data: $content"; }
    <BOOL>      { return 1; }
}
结果{
原始{返回$response;}
数据{返回$data;}
结果{return$data->{results};}
请求id{return$response->header('request-id');}
{return“返回的数据:$content”;}
{返回1;}
}
从中我猜,您可以从
$res->data
$res->results
中获得所需的实际数据,这两种方法都将返回哈希引用。或者,如果需要原始查询响应,可以使用
$res->raw

我认为您需要的值数据是
$res->results->[0]{series}[0]{values}

哦,稍后,
query()
方法的文档说明:

如果返回的对象的计算结果为true,表示查询成功,那么返回的对象的
data
属性将XDB的整个响应作为Perl哈希包含在内。此外,属性
request\u id
提供了XDB在HTTP响应头中设置的请求标识符。例如,这在将请求与日志文件关联时非常有用


但是没有提到
results
属性。

我提到了,它说,“如果返回的对象的计算结果为true,表示查询成功,那么返回的对象的data属性包含来自InfluxDB的整个响应作为Perl散列。”当我尝试将data属性用作散列时,我得到了“不能用作散列”错误。这有点令人困惑。是的,文档中说如果查询成功,数据元素就是散列。仅供参考:删除了我对散列/对象等的评论(都在答案中)你说得对。我也需要数组索引。我认为文档可以更全面一些。举几个例子就好了。我还发现文档中的内容有待改进。一个特别的抱怨是:我看不出文档中有任何内容告诉我如何保留返回对象的属性(属于不同的类)(作为散列)——这正是所谓的“隐藏”(在OO中)!!或者,至少不要紧。他们可能想告诉我如何检索结果,但他们没有。