我从perl开始,编写这个脚本是为了读取文件。但是文件包含超过10k行,如何将读取限制在5行,或者在第5行和第10行之间?
my $pdb = Structure->new(
-file => 'arq.txt',
-format => 'PB'
);
my $strutur = $pb->next_structure;
foreach my $chain ($strutur->get_chains) {
my $chain_id = $chain->id;
foreach my $residue ($strutur->get_residues($chain)) {
my $residue_id = $residue->id;
print "Chain: ".$chain_id."tResidue: ".$residue_id."n";
}
}
首先,我尝试显示五行并打破循环。
use strict;
while(my $strutur = $pb->next_structure) {
print "Chain: ".$chain_id."tResidue: ".$residue_id."n";
last if $. == 5;
}
close $pb;
并获得输出Global symbol "$strutur" requires explicit package name (did you forget to declare "my $estrutura"?)
然后我尝试了
use strict;
while( my $residue_id = $residue->id) {
print "Chain: ".$chain_id."tResidue: ".$residue_id."n";
last if $. == 5;
}
close $residue;
只需第一行就可以实现无限循环
看起来这都是BioPerl的一部分。我对此一点都不熟悉,但很容易找到文档。
你还不完全清楚你只想要哪一部分的5个。所以,让我们仔细研究一下你的代码,看看你能做些什么;我如何阅读5行";因为这段代码抽象了文件格式中的行。我们在这里谈论的是一些实体。我对生物学一无所知,也不知道这些东西的用途。
my $pdb = Structure->new(
-file => 'arq.txt',
-format => 'PB'
);
# (1) This gives you one structure. Call this again, and you'll get another one.
my $strutur = $pb->next_structure;
# (2) This returns all the chains and iterates them, we can limit these
foreach my $chain ($strutur->get_chains) {
my $chain_id = $chain->id;
# (3) This returns all residues in a chain and iterates them.
# We can limit these too.
foreach my $residue ($strutur->get_residues($chain)) {
my $residue_id = $residue->id;
print "Chain: ".$chain_id."tResidue: ".$residue_id."n";
}
}
}
我们可以做三件不同的事情。其中一些可以通过各种方式解决。
每次调用
$pb->next_structure
时,都会得到一个新的结构。如果你想要其中的五个,可以调用五次,或者循环执行。我不认为你在说这个。get_chains()
方法返回与一个结构相关联的所有链。我不知道这两个是什么,但我们可以很容易地使它只迭代其中的5个。my @chains = $strutur->get_chains; for my $i ( 0 .. 4 ) { my $chain = $chains[$i]; my $chain_id = $chain->id; # ...
如果要获取记录5到9,则需要将其更改为
4 .. 8
。索引总是从零开始。要得到5,然后是下一个5,你需要做0 ... 4
,然后做5 .. 9
,依此类推要只处理5次重拨,基本上可以执行与2中相同的操作。