2016-12-02 5 views
0

大きなハッシュの値を繰り返し処理したい場合、そのハッシュの値のいずれかがキーであれば、コンマで区切ったリストに変換したい'query_form'で解析できます。 I以下のデータから今ハッシュの値を繰り返し、コンマで区切られた文字列に変換する

は持っている:

名=ボブ&姓=ウィットブレッド& 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

私はむしろハッシュキーとしてerror1よりも、示唆しているが、これは、あなたが

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

やりたいだろうあなたは、配列を持つほうが良いと思います:

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

総称することをスケールアウト、あなたはウィルlは役立つことが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 
関連する問題