如何只迭代BioPerl结构中的几条记录而不是所有记录?

w80xi6nr  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(146)

我开始在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;

它只使用第一行就形成了一个无限循环

y1aodyip

y1aodyip1#

看起来这都是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";
      }
   }
}

我们可以做三件不同的事情,其中一些可以用不同的方法解决。
1.每次调用$pb->next_structure,都会得到一个新的结构。如果你想要五个这样的结构,就调用它五次,或者在循环中调用它。我认为这不是你所说的。

  1. 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,索引总是从0开始,要得到5,然后是下一个5,你可以这样做0 ... 4,然后是5 .. 9,依此类推。
1.为了只处理5个redidue,你做的事情基本上和2中的一样。

相关问题