2012-01-08 60 views
3

我使用以下代码生成3D坐标(x,y,z)到文件。以预定义格式打印输出Perl

for (my $x = 0.000; $x < 4.200; $x += 1.400) { 
    for (my $y = 0.000; $y < 4.200; $y += 1.400) { 
     for (my $z = 0.000; $z < 4.200; $z += 1.400) { 
      push @arr_grid, "$x $y $z\n"; 
     } 
    } 
} 
foreach (@arr_grid) { 
    say "HETATM 1 O HOH 1 $_ O"; 
} 

现在,我的问题是,我想用指数值像是一门精确的格式(PDB)输出,

1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54      77-78 
(Name) (S.No)      (x)  (y)  (z) 
HETATM 1 O HOH  1  -8.863 16.944 14.289      N 
HETATM 100 O HOH 16  -15.352 11.525 5.325      N 
HETATM 117 O HOH 16  -12.954 9.717 5.182      C 
HETATM 126 O HOH 17  -19.225 11.667 -0.391      C 
HETATM 1005 O HOH 97  9.246 23.287 11.503      O 

这里的X,Y,Z坐标shoulb是数据类型为real(8.2),其他人是正确的。 x,y,z值不是从程序生成的值。我放置了任意值。请帮帮我。与一些适当的变化

 push @arr_grid, "$x $y $z\n"; 

+0

我不明白你的问题。 Perl不是一种严格类型的语言,因此它本身不具有“数据类型真实”的概念。 – 2012-01-08 03:04:43

+0

@JackManey,que是我想要得到输出,如我所示,我在第一行提到索引值,我不需要输出中的前两行。为了理解,我写了前两行。 – gthm 2012-01-08 03:12:21

+0

有几个读取/写入PDB文件的perl模块。看看https://metacpan.org/module/Chemistry::File::PDB – JRideout 2012-01-08 03:28:05

回答

1

想必,你可以取代现有

 push @arr_grid, sprintf("%8.2f %8.2f %8.2f\n", $x, $y, $z); 

这使您可以在号码的格式控制。

1

您可以使用printf指定间距,对齐方式和有效数字。像这样的东西可能会奏效:

my @arr_grid; 
for (my $x = 0.000; $x < 4.200; $x += 1.400) { 
    for (my $y = 0.000; $y < 4.200; $y += 1.400) { 
     for (my $z = 0.000; $z < 4.200; $z += 1.400) { 
      push @arr_grid, [$x, $y, $z]; 
     } 
    } 
} 
foreach (@arr_grid) { 
    printf "HETATM%5d %2s%2s HOH  1 %8.3f%8.3f%8.3f\n", 1, 'O', '', @$_; 
} 

它可能会更有意义,虽然使用专为PDB格式,如Chemistry::File::PDBBio::Structure::IO::pdb

+0

是的,但我想力使用的任何模块。我想学习。 – gthm 2012-01-08 04:12:34

+1

@gthmgeeky,它是一个好东西去尝试,但是当你去发现,某些特殊情况下(通常称为角落的情况下)可能会非常棘手。逗号分隔(csv)数据也会发生同样的情况;它似乎应该很容易,但它不是。一旦你有了学习的乐趣,通常最好利用可用的模块,因为他们经常为你处理所有的角落案例。 – 2012-01-08 06:25:43

+1

+1 CPAN模块 – 2012-01-08 06:26:20

4

你想使用Perl的格式选项呈现输出数据的Perl模块,以预定义的方式。您可以阅读关于它here

你的榜样,改写了一下:

for ($x = 0.000; $x < 4.200; $x += 1.400) { 
    for ($y = 0.000; $y < 4.200; $y += 1.400) { 
     for ($z = 0.000; $z < 4.200; $z += 1.400) { 
     write; 
     } 
    } 
} 

format STDOUT_TOP = 
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54      77-78 
(Name) (S.No)      (x)  (y)  (z) 
. 

format STDOUT = 
HETATM 1 O HOH  1  @<<<<<< @<<<<<< @<<<<<<      N 
           $x  $y  $z 
. 

FORMAT_TOP打印每$=(或$FORMAT_LINES_PER_PAGE),所以如果你想要它打印更很少或高得离谱的数字,如果你想它只是印刷重置这个变量一旦。

输出例如:

1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54      77-78 
(Name) (S.No)      (x)  (y)  (z) 
HETATM 1 O HOH  1  0  0  0       N 
HETATM 1 O HOH  1  0  0  1.4       N 
HETATM 1 O HOH  1  0  0  2.8       N 
HETATM 1 O HOH  1  0  0  4.2       N 
HETATM 1 O HOH  1  0  1.4  0       N 
HETATM 1 O HOH  1  0  1.4  1.4       N 
HETATM 1 O HOH  1  0  1.4  2.8       N 
HETATM 1 O HOH  1  0  1.4  4.2       N 

我多救一个问题:当我打印的数字与小数点像

HETATM 1 O HOH  1  -10  -3.4 -8       N 
HETATM 1 O HOH  1  -10  -3.4 -6.6      N 
HETATM 1 O HOH  1  -10  -3.4 -5.2      N 
HETATM 1 O HOH  1  -10  -3.4 -3.8      N 
HETATM 1 O HOH  1  -10  -3.4 -2.4      N 
HETATM 1 O HOH  1  -10  -3.4 -1       N 
HETATM 1 O HOH  1  -10  -3.4 0.4       N 
HETATM 1 O HOH  1  -10  -3.4 1.8       N 
HETATM 1 O HOH  1  -10  -3.4 3.2       N 
HETATM 1 O HOH  1  -10  -3.4 4.6       N 
HETATM 1 O HOH  1  0  -3.4 6       N 

在上面的专栏中,我需要打印的点十进制在同一个索引中。当我进行计算和更新值时,小数点正在改变。我需要一个像

HETATM 1 O HOH  1  -10  -3.4 -8.0      N 
HETATM 1 O HOH  1  -10  -3.4 -6.6      N 
HETATM 1 O HOH  1  -10  -3.4 -5.2      N 
HETATM 1 O HOH  1  -10  -3.4 -3.8      N 
HETATM 1 O HOH  1  -10  -3.4 -2.4      N 
HETATM 1 O HOH  1  -10  -3.4 -1.0      N 
HETATM 1 O HOH  1  -10  -3.4  0.4      N 
HETATM 1 O HOH  1  -10  -3.4  1.8      N 
HETATM 1 O HOH  1  -10  -3.4  3.2      N 
HETATM 1 O HOH  1  -10  -3.4  4.6      N 
HETATM 1 O HOH  1  -10  -3.4  6.0      N 

编辑1输出:
例到转储文件:

open(DUMPFILE,">output.txt"); 

for ($x = 0.000; $x < 4.200; $x += 1.400) { 
    for ($y = 0.000; $y < 4.200; $y += 1.400) { 
     for ($z = 0.000; $z < 4.200; $z += 1.400) { 
     write DUMPFILE; 
     } 
    } 
} 

close(DUMPFILE); 


format DUMPFILE_TOP = 
1-6 7-11 13-16 18-20 23-26 31-38 39-46 47-54      77-78 
(Name) (S.No)      (x)  (y)  (z) 
. 

format DUMPFILE = 
HETATM 1 O HOH  1  @<<<<<< @<<<<<< @<<<<<<      N 
           $x  $y  $z 
. 
+1

+1格式,未充分利用的Perl的功能,并可能正是这里的正确工具 – 2012-01-08 06:26:44

+0

我听到[Perl6 ::表(http://search.cpan.org/perldoc?Perl6::Form)(Perl6式形式对于Perl5)比内置的好得多。 – ikegami 2012-01-08 10:13:33

+0

@Mattias,如何将此表单输出写入文件?像比程序output.txt的其他>> output.txt的 – gthm 2012-01-11 05:37:47