Как хранить значения в многоуровневом хеше Perl? - PullRequest
1 голос
/ 12 октября 2010

Я хочу сделать что-то подобное. Я помню, у меня были некоторые проблемы с исчезновением значений при программировании, как это. Является ли этот тип структуры «правильным / действительным» для хеша?

my %VAR;
$VAR{SCALAR} = "test scalar";
$VAR{ARRAY}[0] = "test array";
$VAR{HASH}{NAME}[0] = "test hash array 1";
$VAR{HASH}{NAME}[1] = "test hash array 2";
$VAR{HASH}{NAME}[2]{SOMEHASH} = "test hash array hash 1";
$VAR{HASH}{NAME}[2]{ANOTHERHASH} = "test hash array hash 2";

Ответы [ 3 ]

6 голосов
/ 12 октября 2010

Я не вижу причин, почему это не сработает. Какие проблемы вы видите?

Если вы хотите убедиться, что ваша структура данных выглядит так, как вы ожидаете, я рекомендую что-то вроде Data::Dumper:

 # set up your %VAR hash as you like
 use Data::Dumper;
 print Dumper(\%VAR);

Должен получить что-то вроде:

$VAR1 = {
      'HASH' => {
                  'NAME' => [
                              'test hash array 1',
                              'test hash array 2',
                              {
                                'ANOTHERHASH' => 'test hash array hash 2',
                                'SOMEHASH' => 'test hash array hash 1'
                              }
                            ]
                },
      'ARRAY' => [
                   'test array'
                 ],
      'SCALAR' => 'test scalar'
    };
1 голос
/ 13 октября 2010

Это не совсем ваш вопрос, но ... если вы на самом деле строите структуру данных таким образом, вы можете рассмотреть более чистый "буквальный" синтаксис:

#!/usr/bin/perl
use strict;
use warnings;

my %VAR = (
  SCALAR => 'test scalar',
  ARRAY => [
    'test array',
  ],
  HASH => {
    NAME => [
      'test hash array 1',
      'test hash array 2',
      {
        SOMEHASH => 'test hash array hash 1',
        ANOTHERHASH => 'test hash array hash 2',
      },
    ],
  },
);

Основные дваПричины читабельности и ошибки авививификации .Это не неверный perl , но это может привести к трудным для отладки проблемам, таким как случайный ввод:

$VAR{HASH}{NAME}[1] = "test hash array 1";
$VAR{HASH}{NAME}[2] = "test hash array 2";
$VAR{HASH}{NAME}[2] = "test hash array 3";
$VAR{HASH}{NAME}[4] = "test hash array 4";

вместо

$VAR{HASH}{NAME}[1] = "test hash array 1";
$VAR{HASH}{NAME}[2] = "test hash array 2";
$VAR{HASH}{NAME}[3] = "test hash array 3";
$VAR{HASH}{NAME}[4] = "test hash array 4";

, Который не может быть проблемой, если вы используете

$VAR{HASH}{NAME} = [
  undef,
  'test hash array 1',
  'test hash array 2',
  'test hash array 3',
  'test hash array 4',
];
0 голосов
/ 15 октября 2010

Часто, когда люди жалуются на исчезающие ценности, это потому, что они их заменили.Когда вы присваиваете какой-либо части хэша, вы заменяете значение, которое было там ранее, даже если это было ссылочное значение:

use 5.010;

use Data::Dumper;

my %hash;

$hash{key} = { qw(a 1 b 2) };
say Dumper( \%hash );

$hash{key} = 5;
say Dumper( \%hash );

Выходные данные показывают, что ссылка на хэш, которая была вторым уровнем, больше не являетсятам:

$VAR1 = {
          'key' => {
                     'a' => '1',
                     'b' => '2'
                   }
        };

$VAR1 = {
          'key' => 5
        };

Вам просто нужно быть осторожным с тем, что и где вы назначаете, точно так же, как вы делаете это с любой другой переменной.

...