Perl 迭代哈希值并转换为逗号分隔的字符串

Perl 迭代哈希值并转换为逗号分隔的字符串,perl,data-structures,hash,Perl,Data Structures,Hash,我想迭代一个大散列的值,如果该散列的任何值是键,我想把它转换成一个逗号分隔的列表,可以用“query\u form”进行解析 现在,根据以下数据,我有: name=Bob&name=Whitbread&customerErrors=HASH(Xa456)(例如) 以下是我目前掌握的情况: sub convertArgsToQueryString { my $class = shift; my $args = shift; return unless ($args

我想迭代一个大散列的值,如果该散列的任何值是键,我想把它转换成一个逗号分隔的列表,可以用“query\u form”进行解析

现在,根据以下数据,我有:

name=Bob&name=Whitbread&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'
    },
};
查询表格:


name=Bob&name=Whitbread&customerErrors=paymentError,addressError这将满足您的要求

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

我不明白这个问题?你有预期的产出吗?