如何删除数组引用数组中的特定数组?
How to delete a specific array in an array of array references?
我有兴趣从数组引用数组中删除特定数组。为此,我遍历数组引用并寻找匹配项。如果找到匹配项,我会尝试通过将其设置为不等于任何内容来删除此特定数组引用。我编写的脚本中发生了两件奇怪的事情:
1) 代码似乎识别出感兴趣的数组和数组引用之间是否存在匹配,甚至在处理与其匹配的数组引用之前也是如此。
2) 在试图删除一个特定的数组引用时,我最终删除了所有这些引用。这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
my @array_1 = ('CTCTTGCCTCAATCATATAT', 'CTCTTGCCTCATTGATATAT', 'CTCTTGCCTCAATCATATAT', 'CACTTGCCTCAATGAAATTT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGTAATAT', 'CTCTTCCCTCAATGATTTAA', 'CACTTGCCTCAATGATATAT', 'CTCTTGCCTCATTGATATAT', 'CTCTTGCCTCAATGTTATAT', 'CTGATGCCTCATTGATATAT', 'CTGTTGGCTCAATCATATAT');
my @array_2 = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', 'CACTTGCCTCAATGATATAT', 'CTCTTCCCTCAATGATTTAA', 'CTCTTGCCTCAATGTTATAT', 'CTGTTGGCTCAATCATATAT', 'CTGATGCCTCATTGATATAT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGAAATTT');
my @array_3 = ('TATCATTGCCCAATTTAAGT', 'TTTCTTTGCCGAATATAAGT', 'TTTCTATGCGCAATTTAAGT', 'TATCTTAGCCCAATTTTTGT', 'TTTCTTTGCCCAATATATGT', 'TTTCTTTGGCCTATTTTTGT', 'TTTGTTTGGCCATTTTATGT', 'TTTCTTTGGCGAATTTATCT', 'TTTCATTGCCCAATTATTGT', 'TTTCTTTGCCCAAAATAAGT', 'CACTTGCCTCAATGTAATAT');
my @array_4 = ('TTTCTTTGCCCAATATATGT', 'TTTCTTTGCCGAATATAAGT', 'TTTCTATGCGCAATTTAAGT', 'TATCTTAGCCCAATTTTTGT', 'TTTCTTTGGCCTATTTTTGT', 'TTTGTTTGGCCATTTTATGT', 'TTTCTTTGGCGAATTTATCT', 'TTTCATTGCCCAATTATTGT', 'TATCATTGCCCAATTTAAGT', 'TTTCTTTGCCCAAAATAAGT', 'CTCTTGCCTCAATCATATAT');
my $array_1_ref = \@array_1;
my $array_2_ref = \@array_2;
my $array_3_ref = \@array_3;
my $array_4_ref = \@array_4;
my @array_to_delete = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', 'CACTTGCCTCAATGATATAT', 'CTCTTCCCTCAATGATTTAA', 'CTCTTGCCTCAATGTTATAT', 'CTGTTGGCTCAATCATATAT', 'CTGATGCCTCATTGATATAT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGAAATTT');
print "Array to delete: ", join(", ", @array_to_delete), "\n";
my @array_of_array_references = ($array_1_ref, $array_2_ref, $array_3_ref, $array_4_ref);
for (my $i = 0; $i <= $#array_of_array_references; $i++){
print "\n", "A single array in the array of array references: ", join(", ", @{$array_of_array_references[$i]}), "\n";
if (@array_to_delete = @{$array_of_array_references[$i]}){
print "Both arrays match!\n";
@{$array_of_array_references[$i]} = ();
}
}
for (my $i = 0; $i <= $#array_of_array_references; $i++){
print "\n", "A single array in the array of array references after removing one: ", join(", ", @{$array_of_array_references[$i]}), "\n";
}
输出为:
Array to delete: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
A single array in the array of array references: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
Both arrays match!
A single array in the array of array references: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
Both arrays match!
A single array in the array of array references: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
Both arrays match!
A single array in the array of array references: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
Both arrays match!
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
预期输出:
Array to delete: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
A single array in the array of array references: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
A single array in the array of array references: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
Both arrays match!
A single array in the array of array references: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
A single array in the array of array references: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
A single array in the array of array references after removing one: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
A single array in the array of array references after removing one: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
A single array in the array of array references after removing one: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
代码如
if (@array_1 == @array_2) # same number of elements?
测试数组是否具有相同数量的元素。这是因为 ==
运算符在两侧都施加了 scalar context,并且在标量上下文中,数组的计算结果为 return 其元素的数量。
要测试数组是否相等,您需要比较它们的元素,并进行一些额外的检查和改进。至于 Perl 中的许多事情,也有模块可以为我们做这些。
以Array::Compare为例,最简单的用法是:
use Array::Compare;
my $comp = Array::Compare->new;
...
if ($comp->compare(\@ary1, \@ary2)) # they are equal
可以使用该模块设置更多内容,还有许多其他模块可用于数组和列表的所有类型。
问题中的代码也使用=
(赋值!)而不是比较==
。
经过一些简化
use warnings;
use strict;
use Data::Dump qw(dd); # to show complex data structures
use Array::Compare;
my $cobj = Array::Compare->new;
my @data = (
['CTCTTGCCTCAATCATATAT', 'CTCTTGCCTCATTGATATAT', ... ],
['CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', ... ],
...
);
my @ary_to_del = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', ...);
foreach my $ra (@data) {
@$ra = () if $cobj->compare(\@ary_to_del, $ra);
}
dd \@data;
"empties" @data
中的匿名数组等于 @ary_to_del
,正如问题中的代码所做的那样,但它们的数组引用仍保留在 @data
中,即使他们什么都没有。
如果您想完全删除这些元素,则覆盖数组
@data = grep { not $cobj->compare(\@ary_to_del, $_) } @data;
而不是上面的 foreach
循环。这使用 grep 来过滤输入列表,从而只有代码块评估为真的元素在输出列表中被 returned,分配给 @data
.
我有兴趣从数组引用数组中删除特定数组。为此,我遍历数组引用并寻找匹配项。如果找到匹配项,我会尝试通过将其设置为不等于任何内容来删除此特定数组引用。我编写的脚本中发生了两件奇怪的事情: 1) 代码似乎识别出感兴趣的数组和数组引用之间是否存在匹配,甚至在处理与其匹配的数组引用之前也是如此。 2) 在试图删除一个特定的数组引用时,我最终删除了所有这些引用。这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
my @array_1 = ('CTCTTGCCTCAATCATATAT', 'CTCTTGCCTCATTGATATAT', 'CTCTTGCCTCAATCATATAT', 'CACTTGCCTCAATGAAATTT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGTAATAT', 'CTCTTCCCTCAATGATTTAA', 'CACTTGCCTCAATGATATAT', 'CTCTTGCCTCATTGATATAT', 'CTCTTGCCTCAATGTTATAT', 'CTGATGCCTCATTGATATAT', 'CTGTTGGCTCAATCATATAT');
my @array_2 = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', 'CACTTGCCTCAATGATATAT', 'CTCTTCCCTCAATGATTTAA', 'CTCTTGCCTCAATGTTATAT', 'CTGTTGGCTCAATCATATAT', 'CTGATGCCTCATTGATATAT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGAAATTT');
my @array_3 = ('TATCATTGCCCAATTTAAGT', 'TTTCTTTGCCGAATATAAGT', 'TTTCTATGCGCAATTTAAGT', 'TATCTTAGCCCAATTTTTGT', 'TTTCTTTGCCCAATATATGT', 'TTTCTTTGGCCTATTTTTGT', 'TTTGTTTGGCCATTTTATGT', 'TTTCTTTGGCGAATTTATCT', 'TTTCATTGCCCAATTATTGT', 'TTTCTTTGCCCAAAATAAGT', 'CACTTGCCTCAATGTAATAT');
my @array_4 = ('TTTCTTTGCCCAATATATGT', 'TTTCTTTGCCGAATATAAGT', 'TTTCTATGCGCAATTTAAGT', 'TATCTTAGCCCAATTTTTGT', 'TTTCTTTGGCCTATTTTTGT', 'TTTGTTTGGCCATTTTATGT', 'TTTCTTTGGCGAATTTATCT', 'TTTCATTGCCCAATTATTGT', 'TATCATTGCCCAATTTAAGT', 'TTTCTTTGCCCAAAATAAGT', 'CTCTTGCCTCAATCATATAT');
my $array_1_ref = \@array_1;
my $array_2_ref = \@array_2;
my $array_3_ref = \@array_3;
my $array_4_ref = \@array_4;
my @array_to_delete = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', 'CACTTGCCTCAATGATATAT', 'CTCTTCCCTCAATGATTTAA', 'CTCTTGCCTCAATGTTATAT', 'CTGTTGGCTCAATCATATAT', 'CTGATGCCTCATTGATATAT', 'GTCTTGCCTCATTGATAAAT', 'CACTTGCCTCAATGAAATTT');
print "Array to delete: ", join(", ", @array_to_delete), "\n";
my @array_of_array_references = ($array_1_ref, $array_2_ref, $array_3_ref, $array_4_ref);
for (my $i = 0; $i <= $#array_of_array_references; $i++){
print "\n", "A single array in the array of array references: ", join(", ", @{$array_of_array_references[$i]}), "\n";
if (@array_to_delete = @{$array_of_array_references[$i]}){
print "Both arrays match!\n";
@{$array_of_array_references[$i]} = ();
}
}
for (my $i = 0; $i <= $#array_of_array_references; $i++){
print "\n", "A single array in the array of array references after removing one: ", join(", ", @{$array_of_array_references[$i]}), "\n";
}
输出为:
Array to delete: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
A single array in the array of array references: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
Both arrays match!
A single array in the array of array references: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
Both arrays match!
A single array in the array of array references: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
Both arrays match!
A single array in the array of array references: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
Both arrays match!
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
A single array in the array of array references after removing one:
预期输出:
Array to delete: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
A single array in the array of array references: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
A single array in the array of array references: CACTTGCCTCAATGTAATAT, TATCATTGCCCAATTTAAGT, CACTTGCCTCAATGATATAT, CTCTTCCCTCAATGATTTAA, CTCTTGCCTCAATGTTATAT, CTGTTGGCTCAATCATATAT, CTGATGCCTCATTGATATAT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGAAATTT
Both arrays match!
A single array in the array of array references: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
A single array in the array of array references: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
A single array in the array of array references after removing one: CTCTTGCCTCAATCATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATCATATAT, CACTTGCCTCAATGAAATTT, GTCTTGCCTCATTGATAAAT, CACTTGCCTCAATGTAATAT, CTCTTCCCTCAATGATTTAA, CACTTGCCTCAATGATATAT, CTCTTGCCTCATTGATATAT, CTCTTGCCTCAATGTTATAT, CTGATGCCTCATTGATATAT, CTGTTGGCTCAATCATATAT
A single array in the array of array references after removing one: TATCATTGCCCAATTTAAGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGCCCAATATATGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TTTCTTTGCCCAAAATAAGT, CACTTGCCTCAATGTAATAT
A single array in the array of array references after removing one: TTTCTTTGCCCAATATATGT, TTTCTTTGCCGAATATAAGT, TTTCTATGCGCAATTTAAGT, TATCTTAGCCCAATTTTTGT, TTTCTTTGGCCTATTTTTGT, TTTGTTTGGCCATTTTATGT, TTTCTTTGGCGAATTTATCT, TTTCATTGCCCAATTATTGT, TATCATTGCCCAATTTAAGT, TTTCTTTGCCCAAAATAAGT, CTCTTGCCTCAATCATATAT
代码如
if (@array_1 == @array_2) # same number of elements?
测试数组是否具有相同数量的元素。这是因为 ==
运算符在两侧都施加了 scalar context,并且在标量上下文中,数组的计算结果为 return 其元素的数量。
要测试数组是否相等,您需要比较它们的元素,并进行一些额外的检查和改进。至于 Perl 中的许多事情,也有模块可以为我们做这些。
以Array::Compare为例,最简单的用法是:
use Array::Compare;
my $comp = Array::Compare->new;
...
if ($comp->compare(\@ary1, \@ary2)) # they are equal
可以使用该模块设置更多内容,还有许多其他模块可用于数组和列表的所有类型。
问题中的代码也使用=
(赋值!)而不是比较==
。
经过一些简化
use warnings;
use strict;
use Data::Dump qw(dd); # to show complex data structures
use Array::Compare;
my $cobj = Array::Compare->new;
my @data = (
['CTCTTGCCTCAATCATATAT', 'CTCTTGCCTCATTGATATAT', ... ],
['CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', ... ],
...
);
my @ary_to_del = ('CACTTGCCTCAATGTAATAT', 'TATCATTGCCCAATTTAAGT', ...);
foreach my $ra (@data) {
@$ra = () if $cobj->compare(\@ary_to_del, $ra);
}
dd \@data;
"empties" @data
中的匿名数组等于 @ary_to_del
,正如问题中的代码所做的那样,但它们的数组引用仍保留在 @data
中,即使他们什么都没有。
如果您想完全删除这些元素,则覆盖数组
@data = grep { not $cobj->compare(\@ary_to_del, $_) } @data;
而不是上面的 foreach
循环。这使用 grep 来过滤输入列表,从而只有代码块评估为真的元素在输出列表中被 returned,分配给 @data
.