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参考,然后哈哈,谢谢!