Perl 迭代哈希值并转换为逗号分隔的字符串
我想迭代一个大散列的值,如果该散列的任何值是键,我想把它转换成一个逗号分隔的列表,可以用“query\u form”进行解析 现在,根据以下数据,我有: name=Bob&name=Whitbread&customerErrors=HASH(Xa456)(例如) 以下是我目前掌握的情况: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
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
我不明白这个问题?你有预期的产出吗?