2012-01-05 10 views
0

CGIフォームからのエントリで設定されたPerlでネストされたハッシュを作成しようとしています。ここでPerlでネストされたハッシュデータ構造をpopluatingする問題

は抜粋です。その後、

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

を定義しながら、第二の形式は、あなたが持っているどのようなハッシュリファレンス$ and {}定義:

$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 = { 
    product1 => { part => $prod1part, 
           name => $prod1name, 
           price => $prod1price, 
           }, 

変更my $data = {}my %dataたかのように、後であなたは$dataを使用します。第一の形式は、hash%

+0

あなたの言うことは本当に明確ではありません。 –

+0

'my%data'を' my $ data = {} 'に変更する – ccheneson

+0

それはうまくいかなかった...他の提案はありますか? – daniel0mullins

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を参照してください。

関連する問題