我应该如何在多级Perl哈希值中存储值?

时间:2010-10-12 18:49:54

标签: perl perl-data-structures

我希望做这样的事情。我记得在编程这样的时候,我遇到了一些价值消失的问题。这种类型的结构对于哈希是“正确/有效”吗?

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 个答案:

答案 0 :(得分: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 :(得分: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',
];

答案 2 :(得分: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
        };

你必须要小心分配内容的地点和位置,就像你使用任何其他变量一样。