Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:如何对来自数组的哈希进行哈希_Perl_Perl Hash - Fatal编程技术网

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。(注意-如果通过引用执行此操作,则需要确保不会在循环的不同迭代中重用
@值