无法匹配|之间的字符串在Perl

时间:2018-10-26 10:33:06

标签: regex perl

我有一个从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 吗?

2 个答案:

答案 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上的索引才能获取正确的项目。