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;
}