2016-09-09 5 views
0

ネストされたハッシュパラメータをCGIスクリプトのURLにどのように渡す必要がありますか? データ:URL - CGIのネストされたハッシュパラメータ

<URI>?pwd=abc&usr=abb&data[xyz]='xxx' 

をしかし、これは結果に::

my $params = { 
    pwd => 'abc', 
    usr => 'abb', 
    data => { xyz => 'xxx' }, 
}; 

私が試した

$VAR1 = { 
    'data[yxz]'  => 'xxx', 
    'pwd'   => 'abc', 
    'usr'   => 'abb' 
} 

任意のヒントをありがとう。

[OK]を、私は文字列 'data [yxz]'を解析し、全体のペアをhashrefに変換できますが、これには「ネイティブ」関数があるかどうか疑問です。

答えて

2

それを行うにはネイティブな方法はありません。 CGI.pmを使用している場合は、同じ名前の複数のパラメータを渡して、それらをすべて配列にフェッチできます。

GET /?foo=1&foo=2&foo=3 
use strict; 
use warnings; 
use CGI; 
use Data::Dumper; 

my $q = CGI->new; 
my @foo = $q->multi_param('foo'); 

print Dumper \@foo; 

あなたは同じname属性を持つ複数の入力フィールドを持つことにより、HTMLフォームからの行動のこの種を達成します。しかし、それはあなたにハッシュを与えません。


実際のデータ構造に沿って渡すには十分ではありません。 多次元パラメータをJSONとしてエンコードすることができます。

<URI>?pwd=abc&usr=abb&data={'yxz':'xxx'} 

次のように正しくエンコードされます。お使いのアプリケーションで

?pwd=abc&usr=abb&data=%7B%27yxz%27%3A%27xxx%27%7D 

、あなただけJSONモジュールを使用して、Perlのデータ構造にJSONから、それを変換することができます。

+0

@クエンティンこの疑問は、CGI.pmがコアであるかどうかは関係ありません。私は何を意味するのかを詳しく説明します。 – simbabque

+0

データ形式の代わりにJSONを使用することは、HTML形式で生成できる形式からできない形式に変更することを意味します。 – Quentin

+1

@Quen私はOPがそのデータ形式を望んでいるとは思わない。彼らはちょうどそれを試みた。結局のところ、Perlのハッシュリファレンスについて話しています。 – simbabque

0

クエリ文字列は単なる文字列です。あなたは好きなようにデータをエンコードし、好きなパーサーを使ってデータ構造に変換することができます。

ほとんどのパーサーは、キーと値のペアのハッシュを与え、同じ名前のものを配列に展開します。これは、Perl(そしてほとんどのプログラミング言語)がそれをかなり永遠に処理した一般的な方法です。

PHPが使用する拡張データ構造体を使用するには、その形式を扱うように設計されたパーサを使用する必要があります。

いつものように、CPAN to the rescue

use PHP::ParseStr qw(php_parse_str); 
my $data = php_parse_str($ENV{QUERY_STRING}); 
+0

あなたの答えのためのThx。私はこのモジュールを知らなかった。私は今パーサを変更したくないですが、将来私はそれを使用します。 – JMa

関連する問題