0

我有两种从 qiime 分析获得的格式,一种从 silva 数据库获得,另一种从 GreenGenes 获得。这些文件之间的区别在于,silva 文件对每个分类单元都有一个渐进的 D_number(kingdom= D_0__,phylum= D_1__,clase= D_2__ 等等),而 GreenGenes 文件对每个分类单元都有一个字母(kingdom= K__,phylum= p__ , 类= c__ 等等)

file_1 (Silva format)
D_0__Archaea;D_1__Euryarchaeota;D_2__Thermoplasmata;D_3__Thermoplasmatales;D_4__ASC21;D_5__uncultured euryarchaeote



file_2(GreenGenes format)
k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Streptomycetaceae;g__Streptomyces

所以我在 Perl 中制作了两个脚本(一个用于 Silva,一个用于 GreenGenes)以将每个分类单元提取到一个单独的文件中。

我正在尝试在两种格式的匹配部分中合并一段代码,我的意思是:

在第 16 行,我想要两个选项,例如:

my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1/g | m/k__(.*);p/g);

好吧,我知道这行不通

那么如何在同一行中为匹配正则表达式添加两个或多个选项?

这是脚本的一部分(它有 6 个选项,我只写王国选项!!):

while (<INPUTFILE>){
    $line=$_;
    chomp($line);
    if ($line=~ m/^#/g){
        next;
    }
    elsif ($line=~ m/^[Uu]nassigned/g){
        next;
    }
    elsif ($line){
        my @full_line = $_;
        foreach (@full_line){
            my (@taxon_value)= split (/\t/, $_);
            foreach ($taxon_value[0]){
                if ($kingdom){
                    my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1/g); # just for silva
                    foreach (@kingd){
                        if ($_=~/^$/){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]nknown/g){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]ncultured$/g){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]nidentified$/g){
                            next;
                        }
                        else {
                            push @taxon_list, $_;
                        }
                    }
                }
           }
      }
 }

谢谢

4

1 回答 1

2

你需要做你的模式的内部。你用一个|你已经拥有的管道来做到这一点。但它需要进入模式。不需要有两个匹配运算符。

my @kingd = $taxon_value[0] =~ m/D_0__(.*);D_1|k__(.*);p/g

它现在将匹配一个或另一个。有关详细信息,请参阅perlreperlretut。您还应该阅读 SO 上的正则表达式标记 wiki 中提供的信息,因为它包含指向许多有用工具的链接。

您在代码中所做的不起作用的是使用 Perl 的|运算符,它是按位或.

于 2016-10-27T21:06:21.447 回答