匹配 2 个或更多选项 perl
match with 2 or more options perl
我有两种从qiime分析中得到的格式,一种是从silva数据库中得到的,另一种是从GreenGenes中得到的。这些文件之间的区别在于,silva 文件对每个分类单元(kingdom= D_0__、phylum= D_1__、clase= D_2__ 等)都有一个渐进的 D_number 和GreenGenes 文件中的每个分类单元都有一个字母(kingdom= K__、phylum= p__、clase= 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, $_;
}
}
}
}
}
}
感谢
您需要在您的模式中执行 或 。你用你已经拥有的管道 |
来做到这一点。但它需要进入模式。不需要有两个匹配运算符。
my @kingd = $taxon_value[0] =~ m/D_0__(.*);D_1|k__(.*);p/g
它现在将匹配一个或另一个。有关详细信息,请参阅 perlre and perlretut。您还应该阅读 SO 上正则表达式标记 wiki 中提供的信息,因为它包含许多有用工具的链接。
您在代码中所做的不起作用是使用 Perl 的 |
运算符,它是 bitwise or.
我有两种从qiime分析中得到的格式,一种是从silva数据库中得到的,另一种是从GreenGenes中得到的。这些文件之间的区别在于,silva 文件对每个分类单元(kingdom= D_0__、phylum= D_1__、clase= D_2__ 等)都有一个渐进的 D_number 和GreenGenes 文件中的每个分类单元都有一个字母(kingdom= K__、phylum= p__、clase= 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, $_;
}
}
}
}
}
}
感谢
您需要在您的模式中执行 或 。你用你已经拥有的管道 |
来做到这一点。但它需要进入模式。不需要有两个匹配运算符。
my @kingd = $taxon_value[0] =~ m/D_0__(.*);D_1|k__(.*);p/g
它现在将匹配一个或另一个。有关详细信息,请参阅 perlre and perlretut。您还应该阅读 SO 上正则表达式标记 wiki 中提供的信息,因为它包含许多有用工具的链接。
您在代码中所做的不起作用是使用 Perl 的 |
运算符,它是 bitwise or.