我如何在 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
我正在尝试编写一个接受 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