首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以预定义格式打印输出Perl

以预定义格式打印输出Perl
EN

Stack Overflow用户
提问于 2012-01-08 11:02:24
回答 3查看 656关注 0票数 3

我正在用下面的代码生成一个文件的3D坐标(x,y,z)。

代码语言:javascript
复制
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)的输出,其索引值如下:

代码语言:javascript
复制
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坐标应该是real(8.2)数据类型,其他坐标是右对齐的。x,y,z值不是由程序生成的值。我放置了任意值。请帮帮我。

EN

回答 3

Stack Overflow用户

发布于 2012-01-08 11:55:43

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

你可以在here上读到它。

您的示例,稍微重写了一下:

代码语言:javascript
复制
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)打印一次,所以如果你想要更少的打印,重置这个变量,或者如果你只想打印一次,重置一个高得离谱的数字。

输出示例:

代码语言:javascript
复制
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

我还有一个问题:当我打印带有小数点的数字时,比如

代码语言:javascript
复制
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

在上面的列中,我需要打印相同索引中的小数点。当我进行计算和更新值时,小数点会发生移位。我需要像这样的输出

代码语言:javascript
复制
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个

转储文件的示例:

代码语言:javascript
复制
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
.
票数 4
EN

Stack Overflow用户

发布于 2012-01-08 11:44:33

想必,您可以替换现有的:

代码语言:javascript
复制
        push @arr_grid, "$x  $y  $z\n";

使用以下一些适当的变体:

代码语言:javascript
复制
        push @arr_grid, sprintf("%8.2f  %8.2f  %8.2f\n", $x, $y, $z);

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

票数 1
EN

Stack Overflow用户

发布于 2012-01-08 11:44:44

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

代码语言:javascript
复制
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格式设计的perl模块(如Chemistry::File::PDBBio::Structure::IO::pdb )可能更有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8775050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档