我有一个问题,我解决了,但在一个肮脏和非动态的方式。所以我想知道是否有人有更好的解决方案。
我有一个数组,我想使用数组中的每个元素作为单个值的键(实际上我不关心值,我使用这种方法来构建一种树,但无论如何,这不是重点)
我的解决方案是这样的:
@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。当然,这可能会发生,因为我将对几个数组执行此操作。
谁有更好的解决方案?考虑到我真的不在乎它的价值。我把1 2 3 4…例如7,但在任何地方都可以是1或5,这无关紧要。
谢谢!
如果最终值无关紧要,那么大概另一个哈希引用会做吗?
这样的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 Data::Diver.
use Data::Diver qw( DiveVal );
my %arbre;
DiveVal(%arbre, map $_, @array) = 1;
没有数据::潜水员:
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 " ", @array } = 1;
# If @array can contain any characters. (5.10+, IIRC)
$arbre{ pack('(N/a*)*', @array } = 1;
PS -我建议不要使用Switch。点模块。这是一个实验模块,可能会导致很难诊断错误,它根本没有真正帮助你。