我在perl中有一个带有列和行的多维哈希。
将它压缩/重新索引到的最佳方法是什么:
谢谢......
这是一个示例哈希,其结构与我的相似:
foreach $i (1..5) {
$column = int(rand(10)) +1;
foreach $j (1..10) {
$row = int(rand(10)) +1;
$value = int(rand(1000)) +1;
$hash{$column}{$row} = $value if !$hash{$column}{$row};
}
}
+ ---------------------------------------------- ---- +
我将它转换为数组数组。
我能够压缩列,但我无法删除空列。我知道它与切片有关,但无法弄清楚正确的语法。
#AoA - Before#
$VAR1 = [
undef,
[
undef,
4,
0,
61,
0,
22
],
[
undef,
0,
0,
0,
0,
0
],
[
undef,
0,
12,
50,
0,
66
],
[
undef,
70,
42,
22,
0,
0
]
];
foreach $column (0..@AoA -1) {
### Compact column
@{$AoA[$column]} = grep { ($_) } @{$AoA[$column]};
### Remove empty column
### What is the correct syntax for this???
# if(!(scalar @{$AoA[$column]}) ) {
# splice(@AoA, $column, 1);
# }
}
#AoA - After#
$VAR1 = [
[],
[
4,
61,
22
],
[],
[
12,
50,
66
],
[
70,
42,
22
]
];
答案 0 :(得分:0)
查看Data::Table,它提供了一些功能,可让您按照自己的意愿行事。
示例表
my $t = new Data::Table([ ["John", 20], ["Kate", 18], ["Mike", 23] ], ["name", "age"], 0);
my $t1 = new Data::Table; # This is the final clean table
例如,获取一个没有空行的新表
$t1=$t->match_pattern('join('',$_)-> =~ //');
查找并删除空列
my $columns_keep = {};
$t->colsMap( sub { $columns_keep{ $_->[$colIndex] }="1" if $_->[0]; } );
$t1.addCols( $t->delCols( keys $columns_keep ) );
答案 1 :(得分:0)
这是我提出的解决方案。似乎工作得很好。如果有更好的方法,请告诉我。
给定阵列数组。删除列中的空单元格,然后删除空列。
变量的结构(参见原始问题的编辑):$AoA[$column][$row]
### Compact columns.
foreach $column (0..@AoA -1) {
@{$AoA[$column]} = grep { $_ } @{$AoA[$column]};
}
### Remove empty columns
@AoA = grep { scalar @{$_} } @AoA;