【问题标题】:How do I specify these variables correctly on perl?如何在 perl 上正确指定这些变量?
【发布时间】:2016-12-30 10:54:06
【问题描述】:

我运行了一个分子动力学模拟,它给了我 2,000 个轨迹文件。这些文件的文件名格式为au25-c2-benzalacetone.001,最大为2000。我编写了一个通用的perl 程序,但它没有读取2,000 个文件。如何修改我的代码,使其读取每个文件并分别提取我想要的每个文件的坐标?我需要 2,000 个coordinates_of_interest.dat 文件。这里的修补程序文件是au25-c2-benzalacetone 文件。这是我写的代码:

#!/usr/bin/env perl
use Math::VectorReal;
use Math::Trig qw/acos/;
use strict;
use warnings;


   my $file1 = $ARGV[0];
   my $n1 = $ARGV[1];
   my $n2 = $ARGV[2];
   my $tinker_file = sprintf "%s.%03d"

   my( $file1, $n1, $n2 ) = @ARGV; 

  foreach $tinker_file (glob "$tinker_file.*") {
     print "Filename: $tinker_file\n";
  }

   my $file2 = "coordinates_of_interest.dat";
   my %lines_of_interest = map { $_ => 1 } 18, 25, 26;


{
open(FILE2, '>', $file2) or die "couldn't open the file!";

for(my $i=$n1;$i<=$n2;$i++){
{
open(FILE1, '<', $tinker_file) or die "couldn't open the file!";
{

my $num_lines = keys %lines_of_interest;

while (<FILE1>) {
   if ($lines_of_interest{$.}) {
      print FILE2;
      last unless --$num_lines;
              }
            }
         }
       }
    }
 }                                                                                                                                     

~
~
~

【问题讨论】:

  • 您需要修复几个语法错误($n1$n2 上的my),$i 没有用my 声明,你的for 没有用@987654331 关闭@,您的第一个 open 未正确终止(缺少 ) ...)。您可能还应该隐含close()您的文件句柄。
  • 是的。我要在这里编辑这个。我运行了代码,发现 FILE1 和 FILE2 出现问题。

标签: arrays perl variables chemistry


【解决方案1】:

如果文件格式为au25-c2-benzalacetone.001,您的第一个问题似乎是$i 可能不是三位数字。你可能想要my $tinker_file = sprintf "%s.%03d", $file1, $i;

我注意到的另一个问题是,您一直打开“coordinates_of_interest.dat”进行写入,而不是追加,因此只有最后一个文件会有三行。我建议,如果您要为所有输入写入单个文件,请在for 循环的外部(之前)打开该文件,并在循环完成后关闭它。

【讨论】:

    【解决方案2】:

    这些文件的文件名格式为 au25-c2-benzalacetone.001 直到 2000。

    my $tinker_file = sprintf "%s.%03d"
    

    除了这一行不完整之外,您无法将 1 到 2000 的数字放入三位数字段中。这可能是您的脚本没有读取所有文件的原因。

    【讨论】:

      【解决方案3】:

      glob 是您的朋友,或者将其与通配符一起使用并搜索目录:

      my ( $filespec, $n1, $n2 ) = @ARGV; 
      
      foreach my $file ( glob "$filespec.*" ) { 
         print "Filename: $file\n";
      }
      

      或者你可以使用glob来扩展一个模式:

      my $expr = join ",", 0..9;
      
      foreach my $entry ( glob ( "test.{$expr}{$expr}{$expr}" ) ) {
         print $entry,"\n";
      }
      

      但我可能会坚持第一个,因为这样可以确保文件确实存在。

      【讨论】:

      • 当我将它添加到我的代码中时,它给了我以下错误:全局符号“$tinker_file”需要在 ./extract_coordinates.pl 第 15 行有明确的包名称。在 ./extract_coordinates.pl 行有语法错误15、靠近“$tinker_file(”
      • 可能是我错误地实现了文件命名。
      • 我更改了代码以反映您给我的更改
      • 好吧,我的代码不包括$tinker_file,所以它不在那个sn-p中...
      • 我把 filespec 改成了 tinker_file,因为我以为你指的是这个。
      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多