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

How can i make a loop for a string array in Perl?

我正在尝试编写一个接受 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  = ;
        $m2  = ;
        $m3  = ;
        $m5  = ;
        $m6  = ;
        $m7  = ;
        $m8  = ;
        $m9  = ;
        $m10 = ;
        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;

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

这是输入的例子

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

我想这会如你所愿。您的样本数据不是很全面,所以这里所做的只是将最终的残基数更改为 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