如何在Perl中的其他文件中打印标题和字符串的一部分

时间:2019-06-13 10:16:51

标签: perl header output

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

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

我想在另一个名为file_OUT.txt的文件中打印所有“模式”(即BBAACCLLDDCC),并考虑“ 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-Z\s]+)"/){
    $seqs = $1;
    }
}
print(WRITE_HANDLE $seqs);

此代码遇到的问题是:

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

2 个答案:

答案 0 :(得分:2)

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

#!/usr/bin/perl
use warnings;
use strict;

my $def;
while (<>) {
    $def = $1 if m{/def="CODE:(.*?)"};
    print ">$def\n$1\n" if m{/pattern="(.*?)"};
}

答案 1 :(得分:1)

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

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-Z\s]+)"/){
    print (WRITE_HANDLE $1."\n");
  }
}