【问题标题】:iterate dynamic array in perl cgi script在 perl cgi 脚本中迭代动态数组
【发布时间】:2016-08-12 07:46:53
【问题描述】:

我通过 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 脚本。

HTML参数:foo%5Bfoo1%5D=bar1&foo%5Bfoo2%5D=bar2

我不能通过使用$cgi->param('foo[]')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' );

【问题讨论】:

  • 如何将它传递给您的 CGI 脚本?那不是 perl 数据类型,它看起来像一个 json 对象。
  • 是的,它的 json。我使用 jquery $.ajax 来传递它
  • 想想可能需要更多的代码来弄清楚发生了什么。我还要指出 - CGI 已被弃用,尽管我明白这可能不是你可以控制的。
  • $VAR1 = bless( { '.parameters' => [ 'foo[foo1]', 'foo[foo2]' ], 'use_tempfile' => 1, '.charset' => ' ISO-8859-1', '.fieldnames' => {}, 'param' => { 'foo[foo2]' => [ 'bar2' ], 'foo[foo1]' => [ 'bar¹' ] } , '转义' => 1 }, 'CGI' );
  • 在您的输入中没有'foo[]' 参数,只有'foo[foo2]''foo[foo1]'。你确定,jquery 是以 json 格式发送的吗?

标签: jquery arrays perl cgi


【解决方案1】:

您必须将数据作为 json 字符串发送

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

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

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

【讨论】:

  • 抱歉,复制粘贴错误表单重命名为 foo ..my bad
【解决方案2】:

我一直在寻找一种 perl 自己的方法来将 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);
    }
}

【讨论】:

  • 最好不要命名散列 %hash -- % 说它是散列,你应该使用标识符来说明它的用途
【解决方案3】:

我猜你想要这样的东西。首先是发送数据的 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多