如何在perl上正确指定这些变量?

时间:2016-08-23 14:33:38

标签: arrays perl variables chemistry

我进行了分子动力学模拟,给了我2,000个轨迹文件。这些文件的文件名格式为au25-c2-benzalacetone.001,最高可达200​​0.我写了一个通用的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;
              }
            }
         }
       }
    }
 }                                                                                                                                     



3 个答案:

答案 0 :(得分:0)

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

之类的东西

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

答案 1 :(得分:0)

  

这些文件的文件名格式为au25-c2-benzalacetone.001,最高可达200​​0.

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

除了这条线不完整之外,你不能在3位数的字段中输入1到2000之间的数字。这可能是您的脚本没有读取所有文件的原因。

答案 2 :(得分:-1)

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";
}

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