Как напечатать часть заголовка и строки в другом файле в Perl - PullRequest
0 голосов
/ 13 июня 2019

Я начинаю работать в 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-Z\s]+)"/){
    $seqs = $1;
    }
}
print(WRITE_HANDLE $seqs);

Проблемы с этим кодом, с которыми я столкнулся:

  1. Он печатает только последний шаблон в file_OUT.txt
  2. Я не знаю, как последовательно печатать заголовок и шаблон для каждого сайта.

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Держите заголовок в переменной, печатайте его, когда встречаете шаблон:

#!/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 голос
/ 13 июня 2019

Еще один ответ, но при редактировании незначительных деталей в размещенном скрипте

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");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...