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

Flo*_*Flo 4 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我今天学到了一些Perl.我不认为`\(@ foo,@ bar,@ baz)`会做它的功能.谢谢. (7认同)
  • Perl提供了出色的文档.人们应该每年至少一次定期阅读从"perldoc perltoc"链接的所有内容.请参阅"制作参考"中的"perldoc perlref":"*对枚举列表的引用与使用方括号不同 - 而是与创建引用列表相同!*" (2认同)
  • 我必须对阅读有一个遥远的记忆,这给了我尝试它的想法.我仍然不想尝试理解实际上让括号内的逗号知道它们不应该执行通常的列表展平事务的语法部分,因为在解析树的下一个节点处有反斜杠 (2认同)

Sin*_*nür 7

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

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

if ( /MATCH/ ) {
    splice @$_, $i, 1 for values %dataset;
}
Run Code Online (Sandbox Code Playgroud)

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

例如,

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

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