Regex 搜索主题打印标题

Regex 搜索主题打印标题,regex,perl,Regex,Perl,我有一个包含多个字符串的文件;比如data.fa sp | P08246 | ELNE | U人类中性粒细胞弹性蛋白酶OS=智人GN=ELANE PE=1 SV=1 MTLGRRLACLFLACVLPALLLGGTALASEIVGRRARPHAWPFMVSLQLRGGHFCGATLI APNFVMSAAHCVANVNVRVVLGAHNLSREPTRQVFAVQRIFENGIDPVNLLNDIVI LQLNGSATINANVQVAQLPAQGRRLGNGVQCLAMGWGLLGRNRGIASVLQ

我有一个包含多个字符串的文件;比如data.fa

sp | P08246 | ELNE | U人类中性粒细胞弹性蛋白酶OS=智人GN=ELANE PE=1 SV=1 MTLGRRLACLFLACVLPALLLGGTALASEIVGRRARPHAWPFMVSLQLRGGHFCGATLI APNFVMSAAHCVANVNVRVVLGAHNLSREPTRQVFAVQRIFENGIDPVNLLNDIVI LQLNGSATINANVQVAQLPAQGRRLGNGVQCLAMGWGLLGRNRGIASVLQELNVTVVTSL CRRSNRVCTLVRGRQAGVCGDSGSPLVCGLIHGIASFRGGCASGLYPDAFVAQFFN WIDSIIIQRSEDNPHPRPDPASRTHGGGNGVQCLAMGWG sp | P31689 | DNJA1 |人类DnaJ同源亚家族A成员1 OS=智人GN=DNAJA1 PE=1 SV=2 Mvkettyydvlgvkpnatqeelkayrklalkyhpdknpnegekfkqisqayevlsdakk Relydkggeqaikeggagggfgspmdifdmfggggrmqerrrgnvhqlsvttledlyn GATRKLQKNVICDKCEGRGGKKGAVECCPNCCGTGMQIRIHQIGPGMVQQIQSVCMEC QGHGERISPKDRCKSCNGrkivrekkileevhidkgmkdgqkitfhgegdqepglepgdii sp | P10144 | GRAB |人类颗粒酶B OS=智人GN=GZMB PE=1 SV=2 MQPILLALFLLLPRADAGEIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRRDDFVL Taahcwgssinvtlaghnikeqeptqfipvkrpiphpaynpknfsndimllqlerkakr Travqpllpsnkaqvkpgqtcsvgggqtwgqtapghshtlqevkmtqedrkcesdlhy YDSTIELCVGDPEIKTSFGPLVCNKVAQGIVSYGRNGMPPRACTKVSSFvHWI KKTMkryggvqclamgWg 我试图在输出文件上打印标题和motif GNGVQCLAMGWG的编号(如果有的话)。 是 啊这是个新手。我有以下代码

   #!/usr/bin/perl

use strict;
use warnings;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;

my %seqs = %{ read_fasta_as_hash( 'data.fa' ) };
foreach my $id ( keys %seqs ) {
    if ( $seqs{$id} =~ /$motif/ ) {
        print $id, "\n";
        print $seqs{$id}, "\n";
    }
}

sub read_fasta_as_hash {
    my $fn = shift;

    my $current_id = '';
    my %seqs;
    open FILE, "<$fn" or die $!;
    while ( my $line = <FILE> ) {
        chomp $line;
        if ( $line =~ /^(>.*)$/ ) {
            $current_id  = $1;
        } elsif ( $line !~ /^\s*$/ ) { # skip blank lines
            $seqs{$current_id} .= $line
        }
    }
    close FILE or die $!;

    return \%seqs;
}
我需要帮助。

所以,这里:

if ( $seqs{$id} =~ /$motif/ ) {
    print $id, "\n";
    print $seqs{$id}, "\n";
}
你接近目标,但做了不必要的工作。如果我们所需要的只是数字,那么我们可以简单地进行计数并获得前导零:

my $matches = () = $seqs{$id} =~ /$motif/g;
if ($matches > 0) {
    my $matches_string = sprintf('%02d', $matches);
    print "$id: $matches_string\n";
}
另一方面,如果$motif有可能包含正则表达式元字符,并且您也可以假设它可能包含正则表达式元字符,那么您可以:


最后,您是否需要任何特定顺序的结果?keys操作符不能保证按插入的顺序取出钥匙。

不是真的,但最喜欢的部分是输出顺序,也就是说,不是真的,但最喜欢的部分是输出顺序,也就是说,FASTA_header1:模体的数量有些函数很难在我的大脑中找到。你能输入我要运行的实际脚本吗。感谢Rutter。作为输出,除了Fasta头:匹配计数;也可以获得每个字符串的长度吗?@user3489854 Perl使用它来获得字符串的长度。不过,要注意是否要计算换行符等等。
#not escaped
/$motif/g

#escaped
/\Q$motif\E/g