【问题标题】:How to delete a specific array in an array of array references?如何删除数组引用数组中的特定数组?
【发布时间】:2019-01-25 14:53:31
【问题描述】:

我有兴趣从数组引用数组中删除特定数组。为此,我循环遍历数组引用并寻找匹配项。如果找到匹配项,我会尝试通过将其设置为等于空来删除这个特定的数组引用。在我编写的脚本中发生了两件奇怪的事情: 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

【问题讨论】:

  • 当您说“删除”时,您的意思是完全删除该元素(以便最终数组少一个元素),还是用空字符串或undef 替换它(如问题本身说)? (2) 您的阵列通常有多大?
  • If 语句使用 ==eq 而不是单个 = :)
  • 你好 Zdim。我希望完全删除该元素。我的数组大小不一,但平均大小可以在数十万个元素之间。感谢您的提问。
  • 嗨格哈德。感谢您的信息。我会更新我的代码和问题。

标签: arrays perl multidimensional-array arrayofarrays


【解决方案1】:

代码如

if (@array_1 == @array_2)   # same number of elements?

测试数组是否具有相同数量的元素。这是因为== 运算符在两边都施加了scalar context,并且在标量上下文中,对数组进行求值以返回其元素的数量。

要测试数组是否相等,您需要比较它们的元素,并进行一些额外的检查和改进。至于 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;

这会“清空”@data 中等于 @ary_to_del 的匿名数组,就像问题中的代码一样,但它们的数组引用仍保留在 @data 中,即使其中没​​有任何内容。

如果您想完全删除这些元素,请覆盖数组

@data = grep { not $cobj->compare(\@ary_to_del, $_) } @data;

而不是上面的foreach 循环。这使用grep 过滤输入列表,从而在输出列表中仅返回代码块评估为真的元素,并分配给@data

【讨论】:

  • 嗨,zdim。谢谢您的答复。我尝试使用 grep 而不是 foreach 循环。我遇到了两个问题:1)@ary_to_del 需要被取消引用,2)它只保留了我想删除的数组。如何使用它来仅消除我希望删除的数组? foreach 循环完全按照你说的做。
  • @Emma right -- (2) 只有那些 相等的才应该通过,所以条件需要被否定。 (1) 方法compare 需要一个数组reference,和第一次使用一样。固定的。对此感到抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2021-11-11
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多