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

Regex 无法在Perl中匹配|之间的字符串,regex,perl,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 = "|";

我从一个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();
使用严格;
使用警告;
副总管{
my$file=“pxxx.fasta”;
如果(!打开(FASTA$file)){
die“找不到$file\n”;
}
我的$myLine=;
我的$pat=“|””;
我的@Num=$myLine=~/$pat(.*)$pat/;
打印($Num[0]);
关闭(FASTA);
}
main();
FASTA文件句柄的内容是:

sp | P27455 | MOMP | U CHLPN主要外膜孔蛋白OS=肺炎衣原体OX=83558 GN=ompA PE=2 SV=1 MKKLLKSALLSAAFAGSVGSLQALPVGNPSDPSLLIDGTIWEGAGDPCATWCDAIS LRAGFYGDYVFDRILKVDAPKTFSMGAKPTGSAANYTTAVDRPNAPYNKHLHAEWFTN AGFIALNIWDRFVFCTLGASNGYIGNSTAFNLVGGLFGVGTTVNANELPNVSLSNGVV ELYTDTSFSWSVGARGALWECGCATLGAEFQYAQSKPKVEELNVICNVSQFSVNKPKGYK GVAFPLPtdagvatatgTksatinyHewqvGaslSyrlnSlvPygvqWsRatfdAdnir IAQPKLPATVLNLTAWNPSLGNATALSTTDSFSDFMQIVSCQINKFKSRKACGVTVGAT LVDADKWSLTAARLINERAAHVSGQFRF


任何关于如何修复返回代码的线索:P27455?

管道
|
在正则表达式中具有特殊意义。你需要逃避它。最简单的方法是使用
\Q
\E

$myLine =~ /\Q$pat\E(.*?)\Q$pat\E/;
或者你也可以用这个


您也可以不使用正则表达式搜索,而只使用行。如果您总是想要第二列,这也可以

my (undef, $num) = split /\|/, $line;

管道
|
在正则表达式中具有特殊含义。你需要逃避它。最简单的方法是使用
\Q
\E

$myLine =~ /\Q$pat\E(.*?)\Q$pat\E/;
或者你也可以用这个


您也可以不使用正则表达式搜索,而只使用行。如果您总是想要第二列,这也可以

my (undef, $num) = split /\|/, $line;

看起来您正在尝试拆分
|
字符上的行,因此请使用拆分函数

my @Num = split /\|/, $myLine;

这将在
|
上拆分$myLine。请注意,您可能必须更改
@Num
上的索引才能从中获取正确的项。

看起来您正在尝试拆分
|
字符上的行,因此请使用拆分功能

my @Num = split /\|/, $myLine;

这将在
|
上拆分$myLine。请注意,您可能必须更改
@Num
上的索引才能从中获得正确的项。

您可以在代码中改进一些内容,例如使用三个参数
open
和词法文件句柄。两者都使代码更加安全<代码>打开我的$fh,'谢谢你的提示@simbabquemy($match)=$str=~m/\\\\\\\\\;([^\\\\\]*)\\\\\\/g;在代码中有一些地方可以改进,例如使用三个参数
open
和词法文件句柄。两者都使代码更加安全<代码>打开我的$fh,'谢谢你的提示@simbabquemy($match)=$str=~m/\\\\\\\\\;([^\\\\\]*)\\\\\\/g;