将数组内容转换为一行中的散列键



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

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

我的解决方案是这样的:

@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。点模块。这是一个实验模块,可能会导致很难诊断错误,它根本没有真正帮助你。

相关内容

  • 没有找到相关文章