Perl:如何对来自数组的哈希进行哈希
我想使用数组的结构对哈希进行哈希。每个数组元素都应该是前一个数组元素的子键。例如,使用以下阵列:Perl:如何对来自数组的哈希进行哈希,perl,perl-hash,Perl,Perl Hash,我想使用数组的结构对哈希进行哈希。每个数组元素都应该是前一个数组元素的子键。例如,使用以下阵列: @array1 = ("animal","dog","sparky"); @array2 = ("animal","cat","felix"); @array3 = ("animal","bird","penguin",&
@array1 = ("animal","dog","sparky");
@array2 = ("animal","cat","felix");
@array3 = ("animal","bird","penguin","skipper");
我想做一个如下结构的散列:
$hash{“animal”}{“dog”}{“sparky”}=1
数组并不总是具有相同数量的元素。但它应该建立同样的结构
谢谢你的帮助。这听起来像是XY问题-我非常怀疑你有3个独立的编号数组 但是我会在你看到一个更一般的情况下回答你-做这类事情的诀窍是使用散列引用遍历和重置
use Data::Dumper;
my %hash;
my @array1 = ("animal","bird","penguin","skipper");
my $cursor = \%hash;
foreach my $element ( @array1 ) {
$cursor -> {$element} //= {};
$cursor = $cursor -> {$element};
}
$cursor = 1;
print Dumper \%hash;
所以我们沿着你的数据结构走下去;并创建一个子元素-使用/=
创建一个新的子元素,如果并且仅当-还没有定义子元素时
因此,对于您的整套:
use strict;
use warnings;
use Data::Dumper;
my %hash;
my @array1 = ( "animal", "dog", "sparky" );
my @array2 = ( "animal", "cat", "felix" );
my @array3 = ( "animal", "bird", "penguin", "skipper" );
my $cursor = \%hash;
foreach my $array ( \@array1, \@array2, \@array3 ) {
foreach my $element (@$array) {
$cursor->{$element} //= {};
$cursor = $cursor->{$element};
}
$cursor = 1;
$cursor = \%hash;
}
print Dumper \%hash;
现在请注意,这并没有达到预期的效果,因为我们创建了空哈希来填充您的结构。因此,底层是{}
——一个空哈希——而不是您正在寻找的1
$VAR1 = {
'animal' => {
'dog' => {
'sparky' => {}
},
'bird' => {
'penguin' => {
'skipper' => {}
}
},
'cat' => {
'felix' => {}
}
}
};
但希望这能给你一个如何解决问题的想法
值得一看的是,什么是自动生命化,它在做什么——通常它是有用的,但对于构建这种数据结构,它可能不是。我们已经在每个键下面显式地创建了一个空子灰,但前提是其中一个键不存在
因此,为了完成您试图做的事情-我们实际上需要以不同的方式处理最后一个元素-我们不尝试创建和清空子灰分,而是尝试设置一个值
因此:
这给了我们期望的结果:
$VAR1 = {
'animal' => {
'dog' => {
'sparky' => 1
},
'bird' => {
'penguin' => {
'skipper' => 1
}
},
'cat' => {
'felix' => 1
}
}
或者你可以看看
Data::Diver
,它几乎完成了同样的事情。这听起来像是XY问题-我非常怀疑你有3个独立的、编号的数组
但是我会在你看到一个更一般的情况下回答你-做这类事情的诀窍是使用散列引用遍历和重置
use Data::Dumper;
my %hash;
my @array1 = ("animal","bird","penguin","skipper");
my $cursor = \%hash;
foreach my $element ( @array1 ) {
$cursor -> {$element} //= {};
$cursor = $cursor -> {$element};
}
$cursor = 1;
print Dumper \%hash;
所以我们沿着你的数据结构走下去;并创建一个子元素-使用/=
创建一个新的子元素,如果并且仅当-还没有定义子元素时
因此,对于您的整套:
use strict;
use warnings;
use Data::Dumper;
my %hash;
my @array1 = ( "animal", "dog", "sparky" );
my @array2 = ( "animal", "cat", "felix" );
my @array3 = ( "animal", "bird", "penguin", "skipper" );
my $cursor = \%hash;
foreach my $array ( \@array1, \@array2, \@array3 ) {
foreach my $element (@$array) {
$cursor->{$element} //= {};
$cursor = $cursor->{$element};
}
$cursor = 1;
$cursor = \%hash;
}
print Dumper \%hash;
现在请注意,这并没有达到预期的效果,因为我们创建了空哈希来填充您的结构。因此,底层是{}
——一个空哈希——而不是您正在寻找的1
$VAR1 = {
'animal' => {
'dog' => {
'sparky' => {}
},
'bird' => {
'penguin' => {
'skipper' => {}
}
},
'cat' => {
'felix' => {}
}
}
};
但希望这能给你一个如何解决问题的想法
值得一看的是,什么是自动生命化,它在做什么——通常它是有用的,但对于构建这种数据结构,它可能不是。我们已经在每个键下面显式地创建了一个空子灰,但前提是其中一个键不存在
因此,为了完成您试图做的事情-我们实际上需要以不同的方式处理最后一个元素-我们不尝试创建和清空子灰分,而是尝试设置一个值
因此:
这给了我们期望的结果:
$VAR1 = {
'animal' => {
'dog' => {
'sparky' => 1
},
'bird' => {
'penguin' => {
'skipper' => 1
}
},
'cat' => {
'felix' => 1
}
}
或者你可以看看
Data::Diver
,它几乎完成了同样的事情。你自己编写代码的尝试没有成功有什么原因吗?这听起来像是XY问题。你想在这里完成什么?你自己编写代码的尝试没有成功有什么原因吗?这听起来像是XY问题。你想在这里完成什么?这成功了!我在概念上不知道如何处理键名(//=)。还有一个问题,如何分配数组而不是“1”。而不是$cursor->{$last}=1;我想分配一个名为@values的数组。$cursor->{$last}=\@values代码>。(注意-如果通过引用执行此操作,则需要确保不会在循环的不同迭代中重用@值
)这是有效的!我在概念上不知道如何处理键名(//=)。还有一个问题,如何分配数组而不是“1”。而不是$cursor->{$last}=1;我想分配一个名为@values的数组。$cursor->{$last}=\@values代码>。(注意-如果通过引用执行此操作,则需要确保不会在循环的不同迭代中重用@值
)