从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这是目前最完善、可能也是最有效的解决方案。