2016-12-02 25 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 
相關問題