1

我有一个看起来像这样的数组 -

$VAR1 = [
          'sid_R.ba',
          'PS20TGB2YM13',
          'SID_r.BA',
          'ARS',
          'XBUE'
        ]; $VAR2 = [
          'sddff.pk',
          'PQ10XD06K800',
          'SDDFF.PK',
          'USD',
          'PINX'
        ]; $VAR3 = [
          'NULL',
          'NULL',
          'NULL',
          '.',
          'XNAS'
        ]; $VAR4 = [
          'NULL',
          'NULL',
          'NULL',
          '.',
          'XNAS'
        ]; $VAR5 = [
          'NULL',
          'NULL',
          'NULL',
          'EUR',
          'OTCX'
        ]; $VAR6 = [
          'sid.ba',
          'PS20TGB1TN17',
          'SID.BA',
          'ARS',
          'XBUE'
        ];

如果它的任何元素为NULL,我想删除完整的块(数组引用)

我有一个生成数组的代码,所以我尝试了一个 for 循环来删除,但是数组的索引在 for 循环内部减少了。

所以我不知道数组的顺序或数组的长度。请我需要一个通用的解决方案。

请帮忙。

谢谢

4

6 回答 6

7

你似乎有一个像

my @AoA = (
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, "NULL"],
  [9, 10],
);

您要选择所有不包含"NULL". 简单:只需使用嵌套grep

my @AoA_sans_NULL = grep {
  not grep { $_ eq "NULL" } @$_
} @AoA;

grep { CONDITION } @array选择计算结果@arrayCONDITION真的所有元素。

计算内部数组中 s的grep { $_ eq "NULL" } @$_数量。"NULL"如果这是零,我们的条件为真,否则,我们不想保留该子数组。

于 2013-07-09T13:46:18.277 回答
5
    use List::MoreUtils qw(none);
    my @filtered = grep {
      none { $_ eq "NULL" } @$_;
    } @array;
于 2013-07-09T14:02:57.257 回答
2

这是做你想做的吗?

my @new_array = grep { scalar(grep { $_ eq 'NULL' } @{$_}) == 0 } @old_array;
于 2013-07-09T13:48:56.747 回答
0

此代码将比其他代码慢,但如果数据集非常大,就地解决方案可能会很有用。

use List::MoreUtils qw(any);
for(my $i = 0; $i < @AoA; $i ++) {
    splice @AoA, $i --, 1
        if any { $_ eq "NULL" } @{ $AoA[$i] };
}
于 2013-07-09T15:12:47.160 回答
0

grep解决grep方案:

my @array = ...;  #Array of Arrays
for my $array_index ( reverse 0 .. $#array ) { 
    my @inner_array = @{ $array[$array_index] };
    if ( grep /^NULL$/, @inner_array ) {
        splice @array, $array_index, 1;
    }
}
say Dumper @array;

splice命令删除整个子数组。我不需要创建@inner_array我可以@{ $array[$array_index] }在 if 语句中使用我的取消引用,但我喜欢为了清楚起见。

唯一的问题是你必须向后遍历你的数组。如果您从第一个元素到最后一个元素遍历数组,您将删除元素 2,这会导致所有其他元素的索引减少。如果我首先删除元素 4,元素 0 到 3 不会更改它们的索引。

它不像解决方案那样优雅grepgrep更容易维护。想象一下,从现在起六个月后必须通过您的计划的人试图弄清楚什么:

grep { not grep { $_ eq "NULL" } @$_ } @array;

是在做。

于 2013-07-09T15:37:00.717 回答
0

老套:

my @filtered = ();

ARRAY_LOOP:
for my $array ( @AoA ){

  ITEM_LOOP:
  for my $item ( @$array ){

    next ARRAY_LOOP if $item eq 'NULL';

  } # end ITEM_LOOP

  push @filtered, $array;

} # end ARRAY_LOOP
于 2013-07-09T14:16:06.803 回答