2017-01-23 4 views
4

私はCatalystデータベースプロジェクトで作業していて、jQuery経由でいくつかのAJAXリクエストを実行しようとしています。画像1.AJAXリクエストからPerl配列を反復する

List of parameters and values received in AJAX request

に見られるようなパラメータは、OK送信されている「診断」および「type_consents」(及びそれらの対応する日付)の両方が値の配列として送信されることに注意してください(値1、値2、...値n)。

サーバー側の処理では、Catalyst::Request$req->parametersで簡単にデータを取得できますが、それは私のためには機能していないようです。

私はこのようにそれをやっている:

my $params = $c->request->parameters; #Retrieving all parameters 

my @type_consents   = $params->{type_consent}; 
my @date_consents   = $params->{date_consent}; 
my @diagnosis    = $params->{diagnosis}; 
my @date_diagnosis  = $params->{date_diagnosis}; 

それから私は、ループにこれらの配列を必要と値(diagnosis|date , consent|date)の各ペアの挿入を行います。プラス、私は保存して、プロセスのすべての取引をしてeval()ブロックに一度にすべてを実行する必要があるので、私はこのようにそれをやっている:

Debugs of array iteration

my %transactions; 

# Diagnosis 
my $diag_index = 0; 

foreach my $key (0 .. $#diagnosis) { 
    $transactions{diagnosis}{$diag_index} = $diagnosis_mod->new(
     { 
      subject_id   => $subject_id, 
      diagnosis_date  => $date_diagnosis[$key], 
      diagnosis   => $diagnosis[$key], 
      diagnosis_comment => "", 
      suggested_treatment => "" 
     } 
    ); 

    print STDERR "\n" . $date_diagnosis[$diag_index]; 
    print STDERR "\n DEBUG: $date_diagnosis[$diag_index] | $diagnosis[$diag_index] | key: $diag_index"; 
    print STDERR "\n DEBUG2:" . Dumper(@date_diagnosis) . " | " . Dumper(@diagnosis); 

    $diag_index++; 
} 

# I'm avoiding evaluating and performing the transactions so neither eval() nor database impact are shown above. 

これらのデバッグは、次を印刷します

これは、私の "配列"が文字列を持つ単なる一次元の変数であることを示唆していますか?私はそれを分割しようとしたが、どちらもうまくいかない。

答えて

1

ハッシュに格納できる唯一の値はスカラーです。したがって、$params->{type_consent}はスカラーであり、リストではありません。しかし、物(スカラー、配列、ハッシュ、オブジェクト、グロブなど)への参照もスカラーであるため、参照をハッシュに格納することができます。

したがって、$params->{type_consent}は配列への参照であり、配列またはリスト自体ではありません。

私はあなたがしたいと思う何を、そして、my $type_consent = $params->{type_consent};にそれを割り当てた後、あなたの配列(と同じ配列のため、彼らは両方のポイント - @$type_consentを通じて何かを変更すると%$paramsにその配列を変更する)として@$type_consentを使用するかで、my @type_consent = @{$params->{type_consent}};と言って配列をコピーしてください。

私はどちらを選択するかは状況によって異なりますが、コピーする理由がなければメモリ使用量を抑えるために参照オプションに向いています。

+0

どちらもかなり良い結果でした。ありがとう、@タンカルス。私は個人的に2番目のオプションは少し読みやすいので、私はその1つに行くと思うが、どちらも働いた:) –

+0

私はいくつかのテストを行っていた、これは2つ以上の要素が送信されているときにのみうまく動作するようです。 1つの要素(要求可能な最小値)が送信されるたびにこのエラーが表示されます: '[error] pbitdb :: Controller :: Subjects-> addの例外が発生しましたstring(" 1 ")をARRAY ref = "/ home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm" 119行目の "strict refs"を参照してください。 " ...ここでは" 1 "は送信された値です...参照される行は、リストを宣言した行です。 ' my @type_consents = @ {$ params - > {type_consent}}; ' アイデアはありますか? –

+1

IMOでは、スカラー値*または*配列(参照)値を持つことができるキーである動的型を持つのは貧弱です。しかし、呼び出しているAPIがあなたの管理下にない場合、コード内でそれを処理する必要があります: 'my @type_consent = ref $ params - > {type_consent}? @ $ params - > {type_consent}}:$ params - > {type_consent}; '参照として保持するのと似ています:' my $ tc = ref $ params - > {type_consent}? $ params - > {type_consent}:[$ params - > {type_consent}] ' – Tanktalus