尝试在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 = {};
我显然做错了什么,但我无法弄清楚是什么......想法?
答案 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
对源文件的影响最小,所以这是你如何做到的:
%data
和\%data
的提及替换为$data
。这应该将数据放在您希望找到它的位置。
有关%data
和$data
之间差异的详细信息,请参阅perldoc perldata。有关$data = {}
和%data = ()
之间差异的信息,请参阅perldoc perlreftut。