我希望做这样的事情。我记得在编程这样的时候,我遇到了一些价值消失的问题。这种类型的结构对于哈希是“正确/有效”吗?
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";
答案 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
};
你必须要小心分配内容的地点和位置,就像你使用任何其他变量一样。