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;

は、が true と評価される場所grep { CONDITION } @arrayからすべての要素を選択します。@arrayCONDITION

は、内部配列内の の数grep { $_ eq "NULL" } @$_をカウントします。"NULL"これがゼロの場合、条件は true です。それ以外の場合、そのサブ配列を保持したくありません。

于 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

非解決策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。if ステートメントで逆参照を使用できたはず@{ $array[$array_index] }ですが、明確にするのが好きです。

唯一の落とし穴は、配列の配列を逆方向に実行する必要があることです。最初の要素から最後の要素まで配列を調べると、要素 2 が削除され、他のすべての要素のインデックスが減少します。最初に要素 4 を削除すると、要素 0 から 3 のインデックスは変更されません。

ソリューションほどエレガントではgrepありませんgrepが、保守ははるかに簡単です。今から 6 か月後にあなたのプログラムを実行しなければならない人が、次のことを理解しようとしていると想像してください。

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

やっています。

于 2013-07-09T15:37:00.717 に答える
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

古い学校:

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 に答える