我正在使用包含制表符分隔序列的输入文件。序列组由换行符分隔。该文件看起来像:
TAGC TAGC TAGC HELP
TAGC TAGC TAGC
TAGC HELP
TAGC
这是我的代码:
use strict;
use warnings;
open(INFILE, "<", "/path/to/infile.txt") or die $!;
my %hash = (
TAGC => 'THIS_EXISTS',
GCTA => 'THIS_DOESNT_EXIST',
);
while (my $line = <INFILE>){
chomp $line;
my $hash;
my @elements = split "\t", $line;
open my $out, '>', "/path/to/outfile.txt" or die $!;
foreach my $sequence(@elements){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
}
else
}
$count++;
print "Doesn't exist ", $count, "\n";
}
}
}
在打印之前如何判断存在多少序列?我需要将该信息放入输出文件的名称中。
理想情况下,我会在文件名中包含一个变量。不幸的是,我不能只使用@elements的标量,因为有些序列不会被打印出来。当我尝试将存在的键推入阵列然后打印该阵列的标量时,我仍然无法得到我需要的结果。这是我尝试过的(所有需要全局变量的):
open my $out, '>', "/path/to/file.$number.txt" or die $!;
foreach my $sequence(@elements){
if (exists $hash{$sequence}){
push(@Array, $hash{$sequence}, "\n");
my $number = @Array;
print $out ">$sequence\n$hash{$sequence}\n";
#....
感谢您的帮助。真的很感激。
答案 0 :(得分:2)
my $sequences = grep exists $hash{$_}, @elements;
open my $out, '>', "/path/to/outfile_containing_$sequences.txt" or die $!;
在列表上下文中,grep按标准过滤列表;在标量上下文中,它返回符合标准的元素计数。
答案 1 :(得分:0)
最简单的方法是跟踪您在变量中打印的键数,一旦完成循环,只需使用您计算的数字重命名该文件。 Perl具有内置函数来执行此操作。代码将是这样的:
use strict;
use warnings;
open(INFILE, "<", "/path/to/infile.txt") or die $!;
my %hash = (
TAGC => 'THIS_EXISTS',
GCTA => 'THIS_DOESNT_EXIST',
);
my $ammt;
while (my $line = <INFILE>){
chomp $line;
my $hash;
my @elements = split "\t", $line;
open my $out, '>', "/path/to/outfile.txt" or die $!;
foreach my $sequence(@elements){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
$ammt++;
}
else
}
print "Doesn't exist ", $count, "\n";
}
}
}
rename "/path/to/outfile.txt", "/path/to/outfile${ammt}.txt" or die $!;
我删除了$count
变量,因为它未在您的代码中声明(严格会抱怨)。 Here's rename
的官方文件。由于它返回True或False,您可以检查它是否成功。
顺便提一下,请注意:
push(@Array, $hash{$sequence}, "\n");
正在存储两个项目($hash{$sequence}
和\n
),因此计数将是应有的两倍。