2012-01-08 62 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