我开始在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);
我使用此代码遇到的问题是:
- 它只将最后一个图案打印成
file_OUT.txt
- 我不知道如何连续打印每个站点的标题和图案。
将标题保留在变量中,遇到模式时打印它:
#!/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");
}
}