Итерация динамического массива в скрипте Perl CGI

4

Я передаю через jquery

$.ajax({
    'type' : 'POST',
    'data' : { 
               'foo': {
                   'foo1':'bar1,
                   'foo2':'bar2'
               }
            },
    'async' : false,
    'global' : false,
    'url' : "path/to/script.pl",
    'dataType' : "json",
    'success' : function(data) {
        json = data;
    },
    'error' : function(jqxhr, textStatus, error) {
        console.log("Request Failed: " + textStatus);
        console.log(error);
    }
});

на мой cgi script.

HTML Параметр: foo%5Bfoo1%5D=bar1&foo%5Bfoo2%5D=bar2

Я не могу использовать foo как массив, используя $cgi->param('foo[]')

CGI:: param, вызванный в контексте списка из основной строки 30 пакета, что может привести к уязвимостям. См. Предупреждение в разделе "Получение значения или значений одного именованного параметра

Кажется, что все элементы массива жестко закодированы в параметр, например 'foo [foo1]'.

Можно ли получить динамический доступ?

Вывод use Data::Dumper; print Dumper scalar $cgi->Vars();

$VAR1 = bless( {
                 'use_tempfile' => 1,
                 '.fieldnames' => {},
                 '.charset' => 'ISO-8859-1',
                 '.parameters' => [
                                    'foo[foo1]',
                                    'foo[foo2]'
                                  ],
                 'escape' => 1,
                 'param' => {
                              'foo[foo2]' => [
                                               'bar2'
                                             ],
                              'foo[foo1]' => [
                                               'bar¹'
                                             ]
                            }
               }, 'CGI' );
  • 1
    Как вы передаете это в свой CGI-скрипт? Это не тип данных perl, он выглядит как объект json.
  • 0
    да, это JSON. я использую jquery $ .ajax, чтобы передать его
Показать ещё 8 комментариев
Теги:
arrays
cgi

3 ответа

1

Вам нужно отправить данные как строку json

    'data' : JSON.stringify({
               'foo': {
                   'foo1':'bar1',
                   'foo2':'bar2'
               }
            }),

и на стороне сервера преобразует строку в собственную структуру perl,

use JSON;
my $data = decode_json( $cgi->param('keywords') );
  • 0
    извините, скопируйте и вставьте форму ошибки, переименовывая в foo .. мой плохо
0

Я искал метод perl-own для преобразования json-массивов обратно в реальные массивы или хэш.

Итак, я сделал это самостоятельно:

my $cgi = CGI->new();    
my %hash = ();

foreach my $a ($cgi->param())
{
    if($a =~ /^([\w\-]+)\[(.*)\]/)  #TODO multidimensional
    {
        $hash{$1}{$2} = $cgi->param($a);
    }
    else
    {
        $hash{$a} = $cgi->param($a);
    }
}
  • 0
    Лучше не называть хэш %hash - % говорит, что это хэш, и вы должны использовать идентификатор, чтобы сказать что-то о его назначении
0

Я думаю, вы хотите что-то вроде этого. Сначала jquery, который отправляет данные.

<!DOCTYPE html>
<html>
    <head>
        <title>Testing ajax</title> 
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


    <script>

            $(document).ready(function() {

                $("#test").click(function(){
                    $.ajax({
                            type: 'POST',
                            url: 'ajax1.cgi',
                            data: {'foo': { 
                                            'foo1':'bar1', 
                                            'foo2':'bar2'
                                 }
                                 },
                            success: function(res) {

                                                        $( ".demo" ).append("your first var is: " + res.foo1+"<br />");
                                                        $( ".demo" ).append("your second var is  :"+res.foo2);

                                                    },
                            error: function() {alert("did not work");}
                    });
                })

            })



        </script>
    </head>
    <body>

        <button id="test" >Testing</button>
        <div class="demo" >
        </div>
    </body>

Cgi script - ajax1.cgi. Обратите внимание, что ответ отправляется в формате json.

#!/usr/bin/perl

use strict;
use warnings;

use JSON; #if not already installed, just run "cpan JSON"
use CGI;
use Data::Dumper; 


my $cgi = CGI->new;

print $cgi->header('application/json;charset=UTF-8');

#my $id = $cgi->param('foo[]');
my @cgivars=$cgi->param; #get all key value of param in array
my $cgivar1="Not defined";
my $cgivar2="Not defined";
foreach my $a(@cgivars){
 if($cgi->param($a) eq 'bar1'){
       $cgivar1="bar1"; #means do whatever you like to do here
       }
else{
       $cgivar2="bar2"; #same here etc
}
}
#print Dumper scalar $cgi->Vars();
#convert  data to JSON
my $op = JSON -> new -> utf8 -> pretty(1);
my $json = $op -> encode({
    foo1=>$cgivar1,
    foo2=>$cgivar2
});
print $json;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню