Perl:构建没有预定数量的键列的哈希?

时间:2018-06-06 20:59:16

标签: perl hash

我试图写一个能读取分隔文件的函数(想想像/ etc / passwd这样的东西)并在散列中返回值。分隔符,列名和键列将被指定为函数的参数,最后两个作为数组引用传递。它将返回对哈希的引用。

我想同时使用单键和复合键,但是当我事先不知道键的深度时,我无法找出创建哈希的最佳方法。

例如,假设我指定了4列:A,B,C和D,以及两个关键列:A和D.要从文件中的单行分配值,我们有类似的内容:

$var->{A value)->{D value)->{A} = A value;
$var->{A value)->{D value)->{B} = B value;
...

但是,如果我只指定一个键列(B),它将如下所示:

$var->{B value)->{A} = A value;
$var->{B value)->{B} = B value;
...

如果在不知道执行前的关键列数量的情况下概括这一点会有什么方法?

1 个答案:

答案 0 :(得分:1)

use Data::Diver qw( DiveVal );

my @key_col_names = ...;
my @col_names     = ...;

my $data;
while ( my @row = ... ) {
    my %rec; @rec{@col_names} = @row;
    my @keys = @rec{@key_col_names};
    DiveVal($data, map \$_, @keys) = \%rec;
}

您可以使用以下代替DiveVal($data, map \$_, @keys) = \%rec

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

dive_val($data, @keys) = \%rec;