1
open(IN_FILE, $id_file) or die "Cant open $id_file file";

while (my $id_list= <IN_FILE>) {
    chomp $id_list;

    if ($id_list =~ m/^#|^$/g) {
        next;
    }
        # This Works WELL
        # if the file comes in QIIME format 
    elsif($otus_tag){
        if ($id_list =~ m/^$otus_tag\t/g) {
            @list_id = split /\t/, $id_list;

        }

    }
        # This is the section that I want to FIX !!!!
        # if the format are in space, tab, semicolon, comma or in new line.

    elsif(!$otus_tag){
        if ($id_list =~ m/\s|\t|\,|\;/g) {
             @list_id = split /\s|\t|\,|\;/, $id_list;
        }


    } 
}

我有一个 perl 脚本的一部分,用于从 6 种不同格式的文件中提取 id 列表:

    Tab_delimited file:
    Y4.SW08.DCM.X4a_1386    Y4.SW08.DCM.X4a_1457    Y4.SW08.DCM.X4a_1590

    Tab_delimited_QIIME file:
    A100B1      Y4.SW08.DCM.X4a_1386    Y4.SW08.DCM.X4a_1457    Y4.SW08.DCM.X4a_1590

    Space_delimited file:
    Y4.SW08.DCM.X4a_1386 Y4.SW08.DCM.X4a_1457 Y4.SW08.DCM.X4a_1590

    Comma_delimited file:
    Y4.SW08.DCM.X4a_1386,Y4.SW08.DCM.X4a_1457,Y4.SW08.DCM.X4a_1590

    Semicolon_delimited file:
    Y4.SW08.DCM.X4a_1386;Y4.SW08.DCM.X4a_1457;Y4.SW08.DCM.X4a_1590

    List_delimited file:
    Y4.SW08.DCM.X4a_1386
    Y4.SW08.DCM.X4a_1457
    Y4.SW08.DCM.X4a_1590

该代码目前可以很好地将 id 添加到数组中,除了最后一种格式,列表分隔文件,我试图在接下来的 2 行中添加一个 \n:

if ($id_list =~ m/\s|\t|\,|\;|\n/g)
@list_id = split /\s|\t|\,|\;|\n/, $id_list;

但是当文件格式为列表时,它不会将 ids 添加到数组中!!!...... 任何想法 ???

非常感谢

4

1 回答 1

0

我认为您可以稍微简化一下您的代码,因为那里有一些冗余的正则表达式。你真的只需要split在文件的每一行上运行一个函数,其字符类与我认为的可能性相匹配。我可以将其简化为:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

my $file = shift;

my @list_ids;
open(my $fh, "<", $file);
while (<$fh>) {
    next if m/^[\#\$]/;
    my @elems = split(/[\s+,;]/);
    # maybe another next regex / string comparison filter if $otus_tag?
    #next if $otus_tag and ! /.../;  ?
    #next unless $otus_tag eq $elems[0]; ?
    push(@list_ids, $_) for @elems;
}

print "$_\n" for @list_ids;

这在运行 6 种不同的文件类型后输出以下内容:

$ for f in files/*file; do echo $f; ./parse_file.pl $f; echo; done
files/comma.file
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_1590

files/list.file
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_1590

files/semicolon.file
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_159

files/space.file
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_1590

files/tab.file
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_15

files/tab2.file
A100B1
Y4.SW08.DCM.X4a_1386
Y4.SW08.DCM.X4a_1457
Y4.SW08.DCM.X4a_159

我不知道 otus_tag 是什么,也不知道你想用那个变量做什么。但是我提出了一些想法来过滤它,如果那是你想要做的。我表示为“tab2.file”的那个是我认为需要额外过滤的 otus_tag 文件,但是您的代码建议我们在输出中保留不同的字符串,所以我不知道您想在那里做什么。

当我运行您的脚本时,由于我们不知道 $otus_tag 是什么,因此在输入了一些虚拟变量之后,我得到的答案与我的脚本相同。所以,我不完全确定你出了什么问题。也许你得到的一些示例输出和你真正想要的一些示例输出会有所帮助。

于 2017-02-24T13:09:24.050 回答