如何在Perl中为字符串数组创建循环?

时间:2015-06-18 10:46:01

标签: arrays string perl pdb

我正在尝试编写一个接受pdb文件的程序,提取所有信息(原子序号,原子类型,残基名称,残基编号,x,y,z,b因子),重新排列残基编号,以及将新pdb保存在新存档中。我找不到一种方法来使用带字符串数组的循环

这是代码:

print "\nEnter the input file: ";
$inputFile = <STDIN>;
chomp $inputFile;

unless ( open( INPUTFILE, $inputFile ) ) {
    print "Cannot read from '$inputFile'.\nProgram closing.\n";
    <STDIN>;
    exit;
}

chomp( @dataArray = <INPUTFILE> );
close(INPUTFILE);
for ( $line = 0 ; $line <= scalar @dataArray ; $line++ ) {
    if ( $dataArray[$line] =~ m/ATOM\s+(\d+)\s+(\w+)\s+(\w{3})\s+(\w)+\s+(\d+)\s+(\S+\.\S+)\s+(\S+\.\S+)\s+(\S+\.\S+)\s+(.+\S)(.\d\d+\.\d\d.+)/ig ) {
        $m1  = $1;
        $m2  = $2;
        $m3  = $3;
        $m5  = $5;
        $m6  = $6;
        $m7  = $7;
        $m8  = $8;
        $m9  = $9;
        $m10 = $10;
        push( @m3, $m3 );
        push( @m5, $m5 );

        foreach $line ( @m3, @m5 ) {
            if ( $m3[$line] eq $m3[ $line + 1 ] ) {
                $m5[i] = $m5[ i + 1 ];
            }
            elsif ( $m3[$line] ne $m3[ $line + 1 ] ) {
                $m5[ i + 1 ] = $m5[i] + 1;
            }
        }

        $~ = "PDBFORMAT";

        format PDBFORMAT =

ATOM @|||| @||| @|| @|||     @|||||| @|||||| @|||||| @>>>>> @>>>>>

$m1, $m2, $m3,$m51,     $m6,    $m7,    $m8,    $m9,   $m10
.

        open( PDBFORMAT, ">>my2pdb.txt" ) or die "Can't open anything";
        write PDBFORMAT;
    }
}

close PDBFORMAT;

我需要制作一个脚本,根据残留名称使第6列连续(第4列)

这是输入

的示例
ATOM 316 CB LEU A 608 -38.110 31.803 16.459 1.00 64.64
ATOM 317 CG LEU A 608 -39.261 32.481 15.719 1.00 71.07
ATOM 318 CD1 LEU A 608 -38.782 33.704 14.929 1.00 73.68
ATOM 319 CD2 LEU A 608 -39.981 31.498 14.829 1.00 69.63
ATOM 320 H LEU A 608 -36.638 31.041 18.563 1.00 99.99
ATOM 321 N ARG A 565 -38.634 34.587 18.911 1.00 22.27

1 个答案:

答案 0 :(得分:3)

我认为这会按照你的意愿行事。您的样本数据不是很全面,因此这里所做的只是将最终残留数量更改为609

该程序期望输入文件的路径作为命令行上的参数,如

perl process_pdb.pl infile.pdb
use strict;
use warnings;

my ($last_name, $last_num);

while ( <> ) {

  next unless /^ATOM/;

  my @fields = split;
  my $name = $fields[3];

  if ( $last_name ) {
    $fields[5] = $name eq $last_name ? $last_num : $last_num + 1;
  }

  print "@fields\n";

  ($last_name, $last_num) = @fields[3,5];
}

<强>输出

ATOM 316 CB LEU A 608 -38.110 31.803 16.459 1.00 64.64
ATOM 317 CG LEU A 608 -39.261 32.481 15.719 1.00 71.07
ATOM 318 CD1 LEU A 608 -38.782 33.704 14.929 1.00 73.68
ATOM 319 CD2 LEU A 608 -39.981 31.498 14.829 1.00 69.63
ATOM 320 H LEU A 608 -36.638 31.041 18.563 1.00 99.99
ATOM 321 N ARG A 609 -38.634 34.587 18.911 1.00 22.27