从AOA perl中删除数组

从AOA perl中删除数组,perl,multidimensional-array,Perl,Multidimensional Array,我有一个数组,看起来像这样- $VAR1 = [ 'sid_R.ba', 'PS20TGB2YM13', 'SID_r.BA', 'ARS', 'XBUE' ]; $VAR2 = [ 'sddff.pk', 'PQ10XD06K800', 'SDDFF.PK', 'USD', 'PI

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

$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'
        ];
我想删除完整的块数组ref,如果它的任何元素为NULL

我有一个生成数组的代码,因此我尝试删除for循环,但随后在for循环内部减少了数组的索引

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

请帮忙


谢谢

您似乎有一个类似

my @AoA = (
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, "NULL"],
  [9, 10],
);
您希望选择所有不包含NULL的子数组。简单:只需使用嵌套grep:

grep{CONDITION}@array从@array中选择条件值为true的所有元素


grep{$\ueq NULL}@$\统计内部数组中的NULL数。如果该值为零,则我们的条件为真,否则,我们不希望保留该子数组。

您似乎有这样一个数组

my @AoA = (
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, "NULL"],
  [9, 10],
);
您希望选择所有不包含NULL的子数组。简单:只需使用嵌套grep:

grep{CONDITION}@array从@array中选择条件值为true的所有元素


grep{$\ueq NULL}@$\统计内部数组中的NULL数。如果这是零,则我们的条件为真,否则,我们不希望保留该子数组。

这是否符合您的要求

my @new_array = grep { scalar(grep { $_ eq 'NULL' } @{$_}) == 0 } @old_array;

这是你想要的吗

my @new_array = grep { scalar(grep { $_ eq 'NULL' } @{$_}) == 0 } @old_array;
老派:

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
老派:

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

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

use List::MoreUtils qw(any);
for(my $i = 0; $i < @AoA; $i ++) {
    splice @AoA, $i --, 1
        if any { $_ eq "NULL" } @{ $AoA[$i] };
}

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

use List::MoreUtils qw(any);
for(my $i = 0; $i < @AoA; $i ++) {
    splice @AoA, $i --, 1
        if any { $_ eq "NULL" } @{ $AoA[$i] };
}
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;
“拼接”命令将删除整个子阵列。我不需要创建@internal_数组,我本可以在if语句中使用我的去引用的@{$array[$array_index]},但为了清晰起见,我喜欢这样做

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

它不像grep解决方案中的grep那样优雅,但是它更易于维护。想象一下,有人在六个月后必须完成你的计划,试图弄清楚:

grep { not grep { $_ eq "NULL" } @$_ } @array;
正在执行。

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;
“拼接”命令将删除整个子阵列。我不需要创建@internal_数组,我本可以在if语句中使用我的去引用的@{$array[$array_index]},但为了清晰起见,我喜欢这样做

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

它不像grep解决方案中的grep那样优雅,但是它更易于维护。想象一下,有人在六个月后必须完成你的计划,试图弄清楚:

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

正在进行。

我们提出了基本相同的解决方案,尽管您在解包和解释方面做得更好。我们提出了基本相同的解决方案,尽管您在解包和解释方面做得更好。您的。。。可以写为none{$\uEQ NULL}@$\u这是目前最完美、可能也是最有效的解决方案。您的答案是。。。可以写为none{$\uEQ NULL}@$\u这是目前最完善、可能也是最有效的解决方案。