在Perl中暴露嵌套哈希数据结构的问题

时间:2012-01-05 19:54:21

标签: perl cgi

尝试在Perl中创建一个嵌套的哈希,其中填充了CGI表单中的条目。

这是一个片段:

my $section = $q->param('section') || undef;
my %data;

if($section) {
    my $prod1part  = $q->param('prod1part') || undef;
    my $prod2part  = $q->param('prod2part') || undef;
    my $prod3part  = $q->param('prod3part') || undef;

    my $prod1name  = $q->param('prod1name') || undef;
    my $prod2name  = $q->param('prod2name') || undef;
    my $prod3name  = $q->param('prod3name') || undef;

    my $prod1price = $q->param('prod1price') || undef;
    my $prod2price = $q->param('prod2price') || undef;
    my $prod3price = $q->param('prod3price') || undef;

    my $dealprice  = $q->param('dealprice') || undef;

    my $dealtype   = $q->param('dealtype') || undef;

    my $id = &generateID();

    #GENERATE DATA STRUCTURE FOR PDF
    $data = {    product1  => { part  => $prod1part,
                                name  => $prod1name,
                                price => $prod1price,
                              },
                 product2  => { part  => $prod2part,
                                name  => $prod2name,
                                price => $prod2price,
                              },
                 product3  => { part  => $prod3part,
                                name  => $prod3name,
                                price => $prod3price,
                              },
             ... and so on ...
            };
}

但是当我尝试转储数据结构来检查它时:

print $q->header(-type=>'text/plain');
print Data::Dumper->new([\%data],[qw/data/])->Indent(3)->Quotekeys(0)->Dump;

我得到的只是一个空的数据结构!!!

$data = {};

我显然做错了什么,但我无法弄清楚是什么......想法?

3 个答案:

答案 0 :(得分:2)

您已将数据声明为哈希

my %data;

以后你使用$data就好像它是一个哈希引用

$data = { 
    product1  => { part  => $prod1part,
                                name  => $prod1name,
                                price => $prod1price,
                              },

my %data更改为my $data = {};第二个表单定义了哈希引用$ and {},而第一个表单定义了hash%

答案 1 :(得分:1)

你有什么:

$data = { 
    product1  => { part  => $prod1part,

你可能意味着什么:

%data = (
    product1  => { part  => $prod1part,

话虽如此,你正在重复自己。试试这个:

my $section = $q->param('section');
my %data;

if($section) {
  for my $item_id ( 1..3 ){
    my $item_data = $data{ 'product' . $item_id } = {};
    for my $attr (qw'part name price'){
      $item_data->{ $attr } = $q->param( 'prod' . $item_id . $attr );
    }
  }

  my $dealprice  = $q->param('dealprice');
  my $dealtype   = $q->param('dealtype');

  my $id = generateID();
}

答案 2 :(得分:0)

你做错了是use strict失败了。转向限制会告诉你,行开始

$data = {    product1  => { part  => $prod1part,

隐式创建了一个新变量$data。当你稍后检查%data时,你在那里找不到任何东西 - 因为你把它藏在别处而没有注意到。

%data$data是不同的变量。分配到$data不会更改%data。在更改%data后检查$data不太可能达到您想要的效果。

要解决此问题,请先添加

use strict;
use warnings;

位于源文件的顶部;这可能会为您节省许多未来的Stackoverflow之旅。然后选择保留%data$data中的哪一个。它可能与你保持不同;保持$data对源文件的影响最小,所以这是你如何做到的:

  1. %data\%data的提及替换为$data
  2. 这应该将数据放在您希望找到它的位置。

    有关%data$data之间差异的详细信息,请参阅perldoc perldata。有关$data = {}%data = ()之间差异的信息,请参阅perldoc perlreftut