【问题标题】:Iterate through values of a HASH and convert to comma separated strings遍历 HASH 的值并转换为逗号分隔的字符串
【发布时间】:2017-04-17 11:16:17
【问题描述】:

我想遍历一个大散列的值,如果该散列的任何值是键,我想将它转换成一个逗号分隔的列表,可以在 'query_form' 中解析。

现在从下面的数据我有:

name=Bob&surname=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&surname=Whitbread&customerErrors=paymentError,addressError

【问题讨论】:

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

标签: perl data-structures hash


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2018-08-16
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多