我有一个从fasta文件读取的文本,我试图读取Perl中的登录号。但是我没有得到输出。这是代码:
use strict;
use warnings;
sub main {
my $file = "PXXXXX.fasta";
if(!open(FASTA, $file)) {
die "Could not find $file\n";
}
my $myLine = <FASTA>;
my $pat = "|";
my @Num = $myLine =~ /$pat(.*?)$pat/;
print($Num[0]);
close(FASTA);
}
main();
FASTA文件句柄的内容为:
sp | P27455 | MOMP_CHLPN主要外膜孔蛋白OS =肺炎衣原体OX = 83558 GN = ompA PE = 2 SV = 1 MKKLLKSALLSAAFAGSVGSLQALPVGNPSDPSLLIDGTIWEGAAGDPCDPCATWCDAIS LRAGFYGDYVFDRILKVDAPKTFSMGAKPTGSAAANYTTAVDRPNPAYNKHLHDAEWFTN AGFIALNIWDRFDVFCTLGASNGYIRGNSTAFNLVGLFGVKGTTVNANELPNVSLSNGVV ELYTDTSFSWSVGARGALWECGCATLGAEFQYAQSKPKVEELNVICNVSQFSVNKPKGYK GVAFPLPTDAGVATATGTKSATINYHEWQVGASLSYRLNSLVPYIGVQWSRATFDADNIR IAQPKLPTAVLNLTAWNPSLLGNATALSTTDSFSDFMQIVSCQINKFKSRKACGVTVGAT LVDADKWSLTAEARLINERAAHVSGQFRF
任何提示如何修复代码以返回: P27455 吗?
答案 0 :(得分:3)
管道|
在正则表达式中具有特殊含义。您需要逃脱它。最简单的方法是使用\Q
和\E
。
$myLine =~ /\Q$pat\E(.*?)\Q$pat\E/;
或者您可以使用quotemeta
built-in。
my $pat = quotemeta "|";
my @Num = $myLine =~ /$pat(.*?)$pat/; # or use [^$pat]+
您也可以不使用正则表达式搜索,而只需split
行即可。如果您始终想要第二列,那么效果也一样。
my (undef, $num) = split /\|/, $line;
答案 1 :(得分:2)
好像您正在尝试在|
字符上拆分行,因此请使用split函数。
my @Num = split /\|/, $myLine;
这将在|
上拆分$ myLine。请注意,您可能必须更改@Num
上的索引才能获取正确的项目。