我开始在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);
此代码遇到的问题是:
file_OUT.txt
答案 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");
}
}