2012-01-05 76 views
0

嘗試在Perl中創建嵌入哈希,並使用CGI表單中的條目進行填充。在Perl中彈出嵌套哈希數據結構的問題

這裏是一個片段:

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 = {}; 

我明顯做錯了什麼,但我無法弄清楚什麼...想法?

回答

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

你已經宣佈的數據作爲哈希

my %data; 

,以後你使用$data,就好像它是一個哈希裁判

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

更改my %datamy $data = {};第2形式定義的散列引用$ and {}而第一個形式定義的hash%

+0

這是不是很清楚你說什麼要做。 – 2012-01-05 21:19:33

+0

將'my%data'更改爲'我的$ data = {}' – ccheneson 2012-01-05 21:22:53

+0

它沒有工作......任何其他建議? – daniel0mullins 2012-01-05 21:28:22

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提到。

這應該把數據放在你期望找到它的地方。

有關%data$data之間區別的更多信息,請參見perldoc perldata。有關$data = {}%data =()之間差異的信息,請參見perldoc perlreftut