JSON、Perl的哈希填充错误
因此,我正在制作一个程序,从PostgreSQL中获取散列数据,它分别使用两个JSON作为参数文件和输出数据文件。我在获取不应该获取的内容时遇到了一些问题。以下是参数json:JSON、Perl的哈希填充错误,json,postgresql,perl,hash,Json,Postgresql,Perl,Hash,因此,我正在制作一个程序,从PostgreSQL中获取散列数据,它分别使用两个JSON作为参数文件和输出数据文件。我在获取不应该获取的内容时遇到了一些问题。以下是参数json: { "queries": [ { "table_name" : "t1", "subqueries": [ { "query_id" : "t1_1",
{
"queries": [
{
"table_name" : "t1",
"subqueries": [
{
"query_id" : "t1_1",
"query": [
.....some sql query
],
"to_hash" : {
"target_by" : "type_id", // key to index by
"keys" : [
{
"source" : "name", // key in hash from db
"target" : "name" // key in new hash
},
{
"source" : "r",
"target" : "r"
}
]
}
},
{
"query_id" : "t1_2",
"query": [
.....some sql query
],
"to_hash" : {
"target_by" : "type_id",
"keys" : [
{
"source" : "m",
"target" : "m"
}
]
}
}
]
}
]
}
..下面是一个perl子例程:
my $fname = "query_params.json";
my $q_data_raw;
{
local $/;
open(my $fh, "<:encoding(UTF-8)", $fname) or oops("$fname: $!");
$q_data_raw = <$fh>;
close($fh);
}
my $q_data = JSON->new->utf8->decode($q_data_raw);
my %result;
sub blabla {
my $data = shift;
my($tab, $i) = ($data->{table_name}, 0);
if ($data->{subqueries} ne "false"){
my %res_hash;
my @res_arr;
my $q_id;
foreach my $sq (@{$data->{subqueries}}){
my $query = "";
$q_id = $sq->{query_id};
print "\n";
print "$q_id\n";
for(@{$sq->{query}}){
$query .= "$_\n";
}
my $t_by = $sq->{to_hash}{target_by};
my $q_hash = $db_connection->prepare($query);
$q_hash->execute() or die( "Unable to get: " . $db_connection->errstr);
while(my $res = $q_hash->fetchrow_hashref()) {
# print Dumper $res; #print #1
for(@{$sq->{to_hash}->{keys}}){
# print "\nkey:\t" . $_->{target} . "\nvalue:\t".$res->{$_->{source}}; #print #2
$res_hash{$q_id}{$res->{$t_by}}{$_->{target}} = $res->{$_->{source}};
}
$res_hash{$q_id}{$res->{$t_by}}{__id} = $res->{$t_by};
# print Dumper %res_hash; #print #3
}
push @res_arr, $res_hash{$q_id};
# print Dumper $res_hash{$q_id}; #print #4
# print Dumper @res_arr; print #5
$result{$tab}{$q_id} = \@res_arr;
$q_hash->finish();
}
}
}
for (@{$q_data->{queries}}){ // hash from parameter json
blabla($_);
}
my $json = JSON->new->pretty->encode(\%result);
# to json file
不知何故,它从其他子查询中获取查询,这是我不想要的。循环似乎还可以。我做错了什么?好吧,我好像把
@res\u arr
和@res\u hash
初始化到了错误的级别-必须在foreach
中。输出是我需要的。至少我没有复制品
一定要多睡一会儿(
似乎您没有将任何内容放入
@res\u arr
(因此它应该是空的)?$q\u hash->fetchrow\u hashref()
?您的%result
有一个键集,$result{$tab}
——根据您显示的JSON,它应该是t1
,但在最终打印中显示为t2
。代码显示您打印%res\u hash
,然后是(顶级)密钥应该是t1_1
和t1_2
。除非我误读了其中一些。上一次打印显示的是什么数据结构?@zdim是的,我输入了一个错误,刚刚更正了-返回json时是t1
和t1_2
实际上在t1
@HåkonH 230; gland中,我知道-它是带有pa的哈希对象Rametre来自sql查询。在第一个sql中,它是type_id
、name
和r
。第二个查询有type_id
和m
@HåkonHægland更新了缺失的信息。当从原始源复制代码并剪切不相关的片段时,我错过了推入@res arr
,但它存在且不是空的。用作%result
散列的一系列散列。很好,你找到了它!我将把原因归结到所有嵌套的复杂性上。(当这变得太糟糕时,通常意味着是时候编写一个类了。当然,另一方面,有时我们必须非常仔细地挖掘细节。)
{
"t1" : {
"t1_1" : [
{
//type_id_1_* - from first query
"type_id_1_1" : {
"r" : "4746",
"__id" : "type_id_1_1",
"name" : "blablabla"
},
"type_id_1_2" : {
"r" : "7338",
"__id" : "type_id_1_2",
"name" : "nbmnbcxv"
},
....
},
{
//type_id_2_* - from second query
"type_id_2_1" : {
"m" : "6",
"__id" : "type_id_2_1"
},
"type_id_2_2" : {
"m" : "3",
"__id" : "type_id_2_2"
},
............
}
],
"t1_2" : [
{
"type_id_1_1" : {
"r" : "4746",
"__id" : "type_id_1_1",
"name" : "blablabla"
},
"type_id_1_2" : {
"r" : "7338",
"__id" : "type_id_1_2",
"name" : "nbmnbcxv"
},
....
},
{
"type_id_2_1" : {
"m" : "6",
"__id" : "type_id_2_1"
},
"type_id_2_2" : {
"m" : "3",
"__id" : "type_id_2_2"
},
............
}
]
}
}
....
my $q_id;
foreach my $sq (@{$data->{subqueries}}){
my %res_hash;
my @res_arr;
my $query = "";
$q_id = $sq->{query_id};
print "\n";
print "$q_id\n";
..........
}