Perl 如何让Data::Diver生成数组?

Perl 如何让Data::Diver生成数组?,perl,Perl,下面的脚本将输出 $VAR1 = { 'tank' => { 'fs' => { 'fs2b' => undef, 'fs2a' => undef, 'fs2c' => undef

下面的脚本将输出

$VAR1 = {
          'tank' => {
                      'fs' => {
                                'fs2b' => undef,
                                'fs2a' => undef,
                                'fs2c' => undef
                              }
                    }
        };
我真的想要这样的数组散列

$VAR1 = {
          'tank' => {
                      'fs' => [
                                'fs2a',
                                'fs2b',
                                'fs2c'
                              ]
                    }
        };
问题

那怎么办呢

(由中提供的代码用于另一个问题。)

更新

代码中的数组只是一个示例。实数数组有大约100个元素,因此解决方案不能硬编码

DiveVal(\%data, 'tank', 'fs', 0) = 'fs2a';
DiveVal(\%data, 'tank', 'fs', 1) = 'fs2b';
DiveVal(\%data, 'tank', 'fs', 2) = 'fs2c';

要从
“tank”、“tank/fs”、“tank/fs/fs2a”、“tank/fs/fs2b”、“tank/fs/fs2c”
中获取所需的数据结构,需要额外的信息。例如,您可以理解数据结构始终是HoHoA

my @data = ("tank", "tank/fs", "tank/fs/fs2a", "tank/fs/fs2b", "tank/fs/fs2c");
my %data;
for (@data) {
   my @parts = split qr{/};
   if (@parts < 3) {
       DiveVal(\%data, map \$_, @parts);
   } else {
       my $val = pop(@parts);
       push @{ DiveVal(\%data, map \$_, @parts) }, $val; 
   }
}
你甚至可以使用

my @data = ("tank", "tank/fs", "tank/fs/fs2a", "tank/fs/fs2b", "tank/fs/fs2c");
my %data;
for (@data) {
   my @parts = split qr{/};
   push @{ $data{$parts[0]}{$parts[1]} }, $parts[2] if @parts == 3;
}

数据结构总是会是一个HoHoA吗?最后一个太棒了!倒数第二行给出了一个无用的push用法
错误和
if
行的语法错误。修复了各种错误。最后一个假设是,只有一个或两个部分的项目是多余的(即,后面最后会有一个有三个部分的项目)。
my @data = ("tank", "tank/fs", "tank/fs/fs2a", "tank/fs/fs2b", "tank/fs/fs2c");
my %data;
for (@data) {
   my @parts = split qr{/};
   if (@parts < 3) {
       DiveVal(\%data, map \$_, @parts);
   } else {
       my $val = pop(@parts);
       push @{ DiveVal(\%data, map \$_, @parts) }, $val; 
   }
}
my @data = ("tank", "tank/fs", "tank/fs/fs2a", "tank/fs/fs2b", "tank/fs/fs2c");
my %data;
for (@data) {
   my @parts = split qr{/};
   if    (@parts == 1) { \( $data{$parts[0]}            ); }
   elsif (@parts == 2) { \( $data{$parts[0]}{$parts[1]} ); }
   else { push @{ $data{$parts[0]}{$parts[1]} }, $parts[2]; }
}
my @data = ("tank", "tank/fs", "tank/fs/fs2a", "tank/fs/fs2b", "tank/fs/fs2c");
my %data;
for (@data) {
   my @parts = split qr{/};
   push @{ $data{$parts[0]}{$parts[1]} }, $parts[2] if @parts == 3;
}