perl hash - 重新索引到紧凑值的最佳方法

时间:2014-10-27 23:10:59

标签: perl hash

我在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
      ]
    ];

2 个答案:

答案 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;