Проблемы с заполнением структуры вложенных хеш-данных в Perl - PullRequest
0 голосов
/ 05 января 2012

Попытка создать вложенный хэш в 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 ]

2 голосов
/ 06 января 2012

Вы объявили данные как хеш

my %data;

и позже вы используете $data, как если бы это был хэш ref

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

Измените my %data на my $data = {};Во 2-й форме определена ссылка на хеш $ and {}, а в 1-й форме определена hash (%)

1 голос
/ 06 января 2012

Что у вас есть:

$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();
}
0 голосов
/ 06 января 2012

То, что вы сделали неправильно, не удается 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...