Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON、Perl的哈希填充错误_Json_Postgresql_Perl_Hash - Fatal编程技术网

JSON、Perl的哈希填充错误

JSON、Perl的哈希填充错误,json,postgresql,perl,hash,Json,Postgresql,Perl,Hash,因此,我正在制作一个程序,从PostgreSQL中获取散列数据,它分别使用两个JSON作为参数文件和输出数据文件。我在获取不应该获取的内容时遇到了一些问题。以下是参数json: { "queries": [ { "table_name" : "t1", "subqueries": [ { "query_id" : "t1_1",

因此,我正在制作一个程序,从PostgreSQL中获取散列数据,它分别使用两个JSON作为参数文件和输出数据文件。我在获取不应该获取的内容时遇到了一些问题。以下是参数json:

{
    "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";
    ..........
}