早上好,我有一些问题需要解决......让我们看看你是否能回答我的问题。
我有一个带核苷酸的.txt(fasta文件)。每行包含124个核苷酸,我需要读取4个核苷酸的密码子(是的,实际上密码子由3个核苷酸组成,但在这里我真的需要读4个4)。所以,因为124是4的倍数,所以我没有问题。
通过这个循环,我在5秒内创建了5个文件输出:
sub sequence() {
foreach $line (<SEQ>) {
next if (index($line, ">") != -1);
some actions........
但是,如果每条线不是4的倍数怎么办?如果每条线的长度为125个核苷酸怎么办?我已经测试了这个机制(连接所有行,忽略了第一个):
sub sequence() { #Joining lines from the sequence.
$one = "";
while ($line = <SEQ>) {
next if (index($line, ">") != -1);
chomp $line;
$one .= $line; }
但它需要50秒!而不是我最初的5秒。
而不是上面代码中的$one
,我也试过以下代码,但它也需要大约50秒....
$contents = do { local $/; <SEQ> };
$contents =~ s/\A.*?\n//;
$contents =~ tr/\n//;
所以,如果length($line) % 4 !=0
???
谢谢!
答案 0 :(得分:0)
你的字符串可能增长太久了。尝试而不是加载整个字符串然后处理它,以维护未处理文本的字符串缓冲区:
$remaining_codons
)remove
来自$recent_codons
。您可以通过从“do stuff”部分获取一个方法来实现此目的,该方法一次消耗尽可能多的密码子4并返回剩余的0到3个密码子。重新使用您的第一个代码结构可能会是什么样子
sub sequence() {
my $remaining_codons = '';
foreach $line (<SEQ>) {
next if (index($line, ">") != -1);
$remaining_codons = $remaining_codons . $line;
while ( length($remaining_codons) > 3 ) {
my $next_codons = substr( $remaining_codons, 0, 4 );
$remaining_codons = substr( $remaining_codons, 4 );
# Do stuff
}