2016-12-02 66 views
0

我想遍历一个大散列的值,如果该散列的任何值都是键,我想将其转换为逗号分隔列表可以在'query_form'中解析。迭代HASH的值并将其转换为逗号分隔的字符串

现在从下面的数据我:

名=鲍勃&姓=惠特布雷德& customerErrors = HASH(Xa456)(例如)

这是我到目前为止有:

sub convertArgsToQueryString { 
    my $class = shift; 
    my $args = shift; 

    return unless ($args && ref($args) eq 'HASH'); 

    foreach my $key (values %$args) { 
     if (ref($key) eq 'HASH') { 
      # change to a comma separated list 
     } 
    } 

    my $dummyURL = URI->new('', 'http'); 
    $dummyURL->query_form(%$args); 

    return $dummyURL->query; 
    } 

数据:

my $data = { 
    'name' => 'Bob', 
    'surname' => 'Whitbread', 
    'customerErrors' => { 
     'error1' => 'paymentError', 
     'error2' => 'addressError' 
    }, 
}; 

查询表:

名=鲍勃&姓=惠特布雷德& customerErrors = paymentError,addressError

+0

我不明白的问题?你有预期的产量吗? – 123

回答

1

这会做你想要

print join ",", values %{$data->{customerErrors}},"\n"; 

虽然我会建议,而不是error1是哈希键是什么,你会更好的阵列:

my $data = { 
    'name'   => 'Bob', 
    'surname'  => 'Whitbread', 
    'customerErrors' => [ 'paymentError', 'addressError' ], 
}; 

缩放这是泛型,你会升找到ref功能是有帮助的:

foreach my $key (keys %$data) { 
    print "$key is a ", ref $data->{$key},"\n"; 
    if (ref $data->{$key} eq 'HASH') { 
     print join ",", values %{$data->{$key}}; 
    } 
    else { 
     print $data -> {$key},"\n"; 
    } 
} 

或者简洁:

print join "\&", map { #join iterated on & 
    join "=", $_, #join paired values on = 
    ref $data->{$_} eq 'HASH' #ternary to check reference type 
    ? values %{ $data->{$_} } #extract values if HASH 
    : $data->{$_}    #extract just value if not. 
} keys %$data; #iterate keys of data 

其中给出的输出:

name=Bob&customerErrors=addressError=paymentError&surname=Whitbread 
相关问题