Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Arrays 将内容数组成一行中的哈希键_Arrays_Perl_Hash_Multidimensional Array - Fatal编程技术网

Arrays 将内容数组成一行中的哈希键

Arrays 将内容数组成一行中的哈希键,arrays,perl,hash,multidimensional-array,Arrays,Perl,Hash,Multidimensional Array,我有一个问题,我解决了,但在肮脏和非动态的方式。所以我想知道是否有人有更好的解决办法 我有一个数组,我想使用数组的每个元素作为单个值的键(实际上我不关心值,我使用这个方法来构建一种树,但无论如何,这不是重点) 我的解决方案是这样的: @array = qw(un deux voila coucou hey whatsup); $num_elements = scalar(@array); switch ($num_elements) { case 1 { $arbre{$array

我有一个问题,我解决了,但在肮脏和非动态的方式。所以我想知道是否有人有更好的解决办法

我有一个数组,我想使用数组的每个元素作为单个值的键(实际上我不关心值,我使用这个方法来构建一种树,但无论如何,这不是重点)

我的解决方案是这样的:

@array = qw(un deux voila coucou hey whatsup);

$num_elements = scalar(@array);

switch ($num_elements) {
    case 1  { $arbre{$array[0]} = 1 }
    case 2  { $arbre{$array[0]}{$array[1]} = 2 }
    case 3  { $arbre{$array[0]}{$array[1]}{$array[2]} = 3 }
    case 4  { $arbre{$array[0]}{$array[1]}{$array[2]}{$array[3]} = 4 }
    case 5  { $arbre{$array[0]}{$array[1]}{$array[2]}{$array[3]}{$array[4]} = 5 }
    case 6  { $arbre{$array[0]}{$array[1]}{$array[2]}{$array[3]}{$array[4]}{$array[5]} = 6 }
    case 7  { $arbre{$array[0]}{$array[1]}{$array[2]}{$array[3]}{$array[4]}{$array[5]}{$array[6]} = 7 }
    else { print "previous case not true" }
}
正如您所看到的,只有当数组中的元素不超过7个时,它才有效,否则我将不得不添加另一个case。当然,这可能会发生,因为我将使用多个数组来执行此操作

有谁有更好的解决办法吗?事实上,我真的不在乎价值。我把1234。。。7作为一个例子,但它可以是1或5,在任何不重要的地方

谢谢

使用

无数据::潜水员:

sub dive :lvalue {
   my $p = \shift;
   $p = \($$p->{$_}) for @_;
   return $$p;   
}

my %arbre;
dive(\%arbre, @array) = 1;
根据您使用散列的方式,您可能可以使用以下更简单、占用内存更少的解决方案:

# If you can guarantee that chr(0) won't occur in @array
$arbre{ join "\0", @array } = 1;

# If @array can contain any characters. (5.10+, IIRC)
$arbre{ pack('(N/a*)*', @array } = 1;

PS-我建议不要使用Switch.pm模块。这是一个实验性的模块,可能会导致很难诊断错误,而且对您没有任何帮助。

使用

无数据::潜水员:

sub dive :lvalue {
   my $p = \shift;
   $p = \($$p->{$_}) for @_;
   return $$p;   
}

my %arbre;
dive(\%arbre, @array) = 1;
根据您使用散列的方式,您可能可以使用以下更简单、占用内存更少的解决方案:

# If you can guarantee that chr(0) won't occur in @array
$arbre{ join "\0", @array } = 1;

# If @array can contain any characters. (5.10+, IIRC)
$arbre{ pack('(N/a*)*', @array } = 1;


PS-我建议不要使用Switch.pm模块。这是一个实验性的模块,可能会导致很难诊断错误,而且对您没有任何帮助。

如果最终值无关紧要,那么另一个哈希引用大概可以吗

像这样

use strict;
use warnings;

my @keys = qw(un deux voila coucou hey whatsup);
my %arbre;

my $hash = \%arbre;
$hash = ( $hash->{$_} = {} ) for @keys;

use Data::Dump;
dd \%arbre;
输出

{
  un => { deux => { voila => { coucou => { hey => { whatsup => {} } } } } },
}

如果最终的值无关紧要,那么另一个哈希引用大概可以吗

像这样

use strict;
use warnings;

my @keys = qw(un deux voila coucou hey whatsup);
my %arbre;

my $hash = \%arbre;
$hash = ( $hash->{$_} = {} ) for @keys;

use Data::Dump;
dd \%arbre;
输出

{
  un => { deux => { voila => { coucou => { hey => { whatsup => {} } } } } },
}

太好了,谢谢你!另外两个解决方案(join和pack)并不是我想要的,因为它从我所有的数组元素中创建一个键。每个元素都需要一个键,这正是您编写的第一个函数所做的。非常感谢。因为您不关心值是什么,所以我怀疑您只是在使用哈希来检查元素是否存在。如果是这样的话,这些解决方案会更好。太好了,谢谢!另外两个解决方案(join和pack)并不是我想要的,因为它从我所有的数组元素中创建一个键。每个元素都需要一个键,这正是您编写的第一个函数所做的。非常感谢。因为您不关心值是什么,所以我怀疑您只是在使用哈希来检查元素是否存在。如果是这样的话,这些解决方案会更好。不知为什么,我不知道为什么,但是你的代码提供了更好的输出。您显示的输出就是我正在寻找的输出。我的代码和ikegami的代码(顺便说一句,也很棒,再次感谢)给了我以下输出:$VAR1='un'$VAR2={'deux'=>{'voila'=>{'coucou'=>{'hey'=>{'whatsup'=>undef}}};我不明白为什么,但数组的第一个元素似乎位于不同的变量中。但我会同意你的解决方案,因为“树”表示法是完美的。非常感谢。该输出是因为您编写了
打印转储程序%arbre
而不是
打印转储程序\%arbre
是。的确好吧,我会去研究我的perl参考,然后哈哈,谢谢!不知何故,我不知道为什么,但你的代码提供了更好的输出。您显示的输出就是我正在寻找的输出。我的代码和ikegami的代码(顺便说一句,也很棒,再次感谢)给了我以下输出:$VAR1='un'$VAR2={'deux'=>{'voila'=>{'coucou'=>{'hey'=>{'whatsup'=>undef}}};我不明白为什么,但数组的第一个元素似乎位于不同的变量中。但我会同意你的解决方案,因为“树”表示法是完美的。非常感谢。该输出是因为您编写了
打印转储程序%arbre
而不是
打印转储程序\%arbre
是。的确好吧,我会去研究我的perl参考,然后哈哈,谢谢!