以预定义格式Perl打印输出



我正在用以下代码为文件生成三维坐标(x,y,z)。

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  $zn";
        }
    }
}  
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坐标应该是实数(8.2)数据类型,其他坐标都是右对齐的。x、 y、z值不是从程序生成的值。我设置了任意值。请帮帮我。

您希望使用perl的格式选项以预定义的方式显示输出数据。

你可以在这里阅读。

你的例子,改写了一点:

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
.

据推测,您可以替换现有的:

        push @arr_grid, "$x  $y  $zn";

有一些合适的变体:

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

这使您可以控制数字的格式。

您可以使用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.3fn", 1, 'O', '', @$_;
}

不过,使用为PDB格式设计的perl模块可能更有意义,例如Chemistry::File::PDB或Bio::Structure::IO::pdb

相关内容

  • 没有找到相关文章

最新更新