如何在Perl中的另一个文件中打印部分标头和字符串



我开始在Perl中工作。我有一个名为file_IN.txt的文件,其中包含以下行:

SITE     1   
         /def="CODE:X22"      
         /pattern="BBAACCLLDDCC"     
SITE     2  
         /def="CODE:X33".  
         /pattern="MMKKNNJJXXVV"

我想打印所有"图案"(即 BBAACCLLDDCC(在另一个名为file_OUT.txt的文件中,考虑到"def"部分(即X22(作为标题:

示例输出:

>X22  
BBAACCLLDDCC.  
>X33        
MMKKNNJJXXVV

我尝试了以下代码:

#!/usr/bin/perl -w
use warnings;
if(!open(MY_HANDLE, "file_IN.txt")){
    die "Cannot open the file";
}
@content = <MY_HANDLE>;
close(MY_HANDLE);
if(!open(WRITE_HANDLE, ">>file_OUT.txt")){
    die "Cannot open the file";
}
foreach $row (@content){
    if ($row =~ /def="([A-Z/:A-Z]+)"/g){
    $def = $1
    }
    if ($row =~ /pattern="([A-Zs]+)"/){
    $seqs = $1;
    }
}
print(WRITE_HANDLE $seqs);

我使用此代码遇到的问题是:

  1. 它只将最后一个图案打印成file_OUT.txt
  2. 我不知道如何连续打印每个站点的标题和图案。

将标题保留在变量中,遇到模式时打印它:

#!/usr/bin/perl
use warnings;
use strict;
my $def;
while (<>) {
    $def = $1 if m{/def="CODE:(.*?)"};
    print ">$defn$1n" if m{/pattern="(.*?)"};
}

另一个答案,但在编辑发布的脚本中的一些小细节时

use strict;
use warnings;
if(!open(MY_HANDLE, "file_IN.txt")){
    die "Cannot open the file";
}
my @content = <MY_HANDLE>;
close(MY_HANDLE);
if(!open(WRITE_HANDLE, ">>file_OUT.txt")){
    die "Cannot open the file";
}
foreach my $row (@content){
  chomp($row);
  if ($row =~ /def="[A-Z]*:([A-Z|0-9]+)"/g){
    print (WRITE_HANDLE ">".$1."n");
  }
  if ($row =~ /pattern="([A-Zs]+)"/){
    print (WRITE_HANDLE $1."n");
  }
}

最新更新