2017-01-23 2 views
4

Я работаю над проектом базы данных Catalyst и пытаюсь выполнить некоторые запросы AJAX через jQuery. Параметры посылаются ОК, как можно видеть в изображении 1.Итерация через массив Perl из запроса AJAX

List of parameters and values received in AJAX request

Обратите внимание, что как «диагностика» и «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() блоке, поэтому я делаю это так:

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. 

Эти напечатает отладка следующее:

Debugs of array iteration

Означает ли это, что мой «массив» - это просто одномерная переменная со строкой? Я попытался разбить его, но это тоже не сработает.

ответ

1

Единственными значениями, которые вы можете сохранить в хэше, являются скаляры. Таким образом, $params->{type_consent} является скаляром, а не списком. Однако, поскольку ссылки на вещи (скаляры, массивы, хэши, объекты, глобусы и т. Д.) Также являются скалярами, вы можете хранить ссылки в хэше.

То, что $params->{type_consent} является, следовательно, ссылкой на массив, а не на массив или список.

То, что я думаю, что вы хотите, то, либо назначить, что my $type_consent = $params->{type_consent};, а затем использовать @$type_consent в качестве массива (и, таким образом, они оба указывают на тот же массив - изменение что-то через @$type_consent изменяет этот массив в %$params), или скопируйте массив, указав my @type_consent = @{$params->{type_consent}};.

Какой вариант я использую, ситуативен, но я склоняюсь к эталонному варианту, если только для уменьшения использования памяти, если нет причин для его копирования.

+0

Ну оба сделали довольно хорошо. Большое спасибо, @ Танкалус. Я лично думаю, что второй вариант немного легче читать, поэтому я собираюсь с ним, но оба работали :) –

+0

Я проводил некоторое тестирование, и кажется, что это работает нормально ТОЛЬКО при отправке 2 или более элементов. Я получаю эту ошибку каждый раз, когда отправляется 1 элемент (минимально приемлемый для запроса): '[ошибка] Исправлено исключение в pbitdb :: Controller :: Subjects-> add" Нельзя использовать строку ("1") в качестве ARRAY ref в то время как «строгие ссылки» используются в /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm строке 119. «' ... где в этом случае " 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

Смежные вопросы