值不是数组引用错误

时间:2013-06-21 10:22:01

标签: arrays perl reference

我有一个复选框列表。我试图将选定的复选框列表传递给perl脚本。我使用folliwng代码获取复选框列表:

function exec(){
    var checkedValue = "";  
    var inputElements = document.getElementsByTagName('input'); 
    for(var i=0; inputElements[i]; i++){ 
      if(inputElements[i].className==="chk" &&  
         inputElements[i].checked){ 
           checkedValue += inputElements[i].value;
           if (inputElements[i+1])
               checkedValue += ", ";
           else
               checkedValue += "";  
      } 
    } 

然后我将“checkedValue”传递给perl脚本,如下所示:

self.location='/cgi-bin/ATMRunJob.pl?tcs='+checkedValue;

在perl脚本中,我按如下方式读取数组:

our @testCasesToRun = $var->param("tcs");

然后将其分配给哈希,如下所示:

my $runSpec = {

         TestCasesToRun    => @testCasesToRun
      };

但是,当我在浏览器中加载页面时出现以下错误:

Failed TestLimits() with error: [hash: k=TestCasesToRun, v=1,]:[array]:Value is not an array ref
In check against following TLS:
[
  'hr',
  {
    'OptDefaults' => {
      'JobRunningGroupName' => 'astbluetooth',
      'RunMode' => 'Queue',
      'CountTowardsReporting' => 1,
      'JobOwnerGroupName' => 'astbluetooth',
      'SelectSetupTeardown' => 1
    },
    'Optional' => {
      'TestCasesToRun' => [
        'ar',
        undef,
        undef,
        [
          'r',
          1,
          undef
        ]
      ],

我是perl和CGI脚本的新手。我怎么能解决这个错误?

注意:为简洁起见,所有代码片段都已缩短,但仍然描述了问题的本质。

编辑:我想做的就是这个。用户从他想要执行的已复选列表中选择一个测试用例列表。我获取所有选定测试用例的测试用例id并将其传递给perl脚本。在perl脚本中,我只需要将这些选定的测试用例id分配给runspec哈希中的TestCasesToRun元素。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

  1. 您正在将数组指定为hashkey值。这不起作用;你需要分配一个数组ref:

     my $runSpec = {
         TestCasesToRun    => \@testCasesToRun
     };
    

    鉴于代码编译,我有一种感觉,你刚刚搞砸了Q中的示例 - 请将它们修复为准确反映您的代码,即使它们稍微不那么简短。

  2. 您的'tcs'参数是单个字符串(通过JS分配)。那么为什么你首先将param('tcs')的结果分配给一个数组呢?您的代码中是否有某个split未包含在示例中?

  3. 您的转储包含数组引用中的数组引用。您需要详细说明TestCasesToRun arrayref的预期结构,并显示在测试运行器中处理它的代码。

  4. 根据你上次的评论:

    • 使用简单的逗号更改您的JavaScript代码以加入:checkedValue += ",";

    • 将您的Perl分配更改为:our @testCasesToRun = split(/,/, $var->param("tcs"));