如何将拼接或任何其他函数应用于Perl中的几个不同数组?

时间:2017-05-05 13:24:11

标签: arrays perl loops

我正在尝试缩短以下代码:

    if ( /MATCH/ ){
        splice @identifiers,            $i, 1;
        splice @sequences,              $i, 1;
        splice @optional_informations,  $i, 1;
        splice @quality_scores,         $i, 1;
        splice @barcodes,               $i, 1;
    }

有没有办法迭代每个数组并执行拼接或任何其他功能?

3 个答案:

答案 0 :(得分:9)

您可以迭代一系列引用:

@all_arrays = \( # Note the ref-making backslash applied to the list
    @identifiers,
    @sequences,
    @optional_informations,
    @quality_scores,
    @barcodes
);
for $array (@all_arrays)
{
    splice @$array, $i, 1;
}

答案 1 :(得分:8)

当您发现自己想要对许多相关数据结构执行类似操作时,这表明它们应该是更大数据结构的成员。在这种情况下,您可以将所有数组放在哈希中:

my %dataset = (
    identifiers    => [],
    sequences      => [],
    optional_info  => [],
    quality_scores => [],
    barcodes       => [],
);

if ( /MATCH/ ) {
    splice @$_, $i, 1 for values %dataset;
}

事实上,正如@ikegami在评论中指出的那样,其他数据结构可能更合适,具体取决于您可能执行的操作类型。例如,如果您需要使用变量值的一个子集来选择记录,比如30到70之间的quality_scores,那么最好将数据存储为哈希数组(如果顺序很重要) ,或作为哈希的散列(如果顺序无关紧要,或者您是否愿意在数据集中添加序数。

例如,

 my %dataset = (
    id0 => {
        t => '...',
        id => '...',
        sequence => '...',
        optional_info => '...',
        quality_score => '...',
        barcoode => '...',
    },
    # ...
    idn => {
        t => '...',
        id => '...',
        sequence => '...',
        optional_info => '...',
        quality_score => '...',
        barcoode => '...',
    },
 );

使用该数据结构,您可以使用其标识符(或键入t时的索引)删除特定记录。

答案 2 :(得分:0)

我们可以在一个数组中集中存储数组的引用,并按如下方式迭代它。

foreach my $arr_ref (\(@identifiers,@sequences,@optional_informations,@quality_scores)){

     my @tmparr=@{ $arr_ref }[3,4];#slice operation or any other operation can be performed

}