在perl cgi脚本中迭代动态数组

时间:2015-07-10 08:40:51

标签: jquery arrays perl cgi

我通过jquery传递

L

到我的cgi脚本。

HTML参数:final long a = 24 * 60 * 60 * 1000 * 1000L;

我不能使用$.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); } }); 作为数组使用foo%5Bfoo1%5D=bar1&foo%5Bfoo2%5D=bar2

CGI :: param在包主线30的列表上下文中调用,这可能会导致漏洞。请参阅"获取单个命名参数的值

中的警告

我似乎所有数组元素都被硬编码到参数中,例如&f; [foo1]'。

是否可以获得动态访问权限?

foo

的输出
$cgi->param('foo[]')

3 个答案:

答案 0 :(得分:1)

您必须以json string

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

并在服务器端将字符串转换为本机perl结构,

use JSON;
my $data = decode_json( $cgi->param('keywords') );

答案 1 :(得分: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脚本是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;

答案 2 :(得分: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);
    }
}