2010-10-12 2 views
1

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

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"; 
+2

Что происходит, когда вы запускаете его с помощью 'use strict; использовать предупреждения; – Ether

+0

У вас есть пример этих проблем со значениями, исчезающими, о которых вы упоминаете? – CanSpice

+0

Если структура лучше всего представляет ваши данные, и она работает, то почему бы и нет? (Мне, похоже, не нравится, как крик ко мне.) Поскольку это, очевидно, тестовые данные, мы никак не можем помочь вам в том, хорошо ли это подходит для * ваших * данных. Итак, вы должны быть судьей. – Axeman

ответ

6

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

Если вы хотите, чтобы убедиться, что ваша структура данных выглядит так, как и следовало ожидать, я рекомендую что-то вроде 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

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

#!/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', 
     }, 
    ], 
    }, 
); 

Основные две причины - читаемость и ошибки autovivification. Это не неправильно 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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^