2016-08-23 21 views
-1

我跑了一個分子動力學模擬,給了我2000個軌跡文件。這些文件的文件名格式爲au25-c2-benzalacetone.001,最高爲2000.我編寫了一個普通的perl程序,但它沒有讀取2000個文件。如何修改我的代碼以便它讀取每個文件並分別提取每個文件的座標?我需要2,000 coordinates_of_interest.dat文件。這裏的修補程序文件是au25-c2-benzalacetone文件。這是我寫的代碼:如何在Perl上正確指定這些變量?

#!/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; 
       } 
      } 
     } 
     } 
    } 
}                                  



+1

您需要解決幾個語法錯誤(''上$ n1'和'$ n2' my'),'$ i'不與'my',你的'for'未與關閉'}'宣佈,你的第一個'open'沒有正確終止(缺少')'...)。你應該也可以暗示'close()'你的文件句柄。 –

+0

是的。我即將在此處進行編輯。我運行了代碼,它給了我FILE1和FILE2的問題。 –

+0

謝謝@DravSloan –

回答

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

但我可能會堅持與第一個,因爲這將確保文件實際存在。

+0

當我加入這個我的代碼它給我以下錯誤:全局符號「$ tinker_file」需要明確包名在./extract_coordinates.pl線15 在./extract_coordinates.pl 15行語法錯誤附近「$ tinker_file(」 –

+0

也許我執行文件命名不正確。 –

+0

我改變了我的代碼,以反映你給我的改變哦 –

0

如果文件格式是au25-c2-benzalacetone.001,你的第一個問題似乎是$i可能不是三位數。你可能my $tinker_file = sprintf "%s.%03d", $file1, $i;

我注意到另外一個問題是,你繼續穩步開放「coordinates_of_interest.dat」寫,沒有追加,所以只有最後一個文件將擁有三條線存在。我建議如果您要爲所有輸入寫入單個文件,請在for循環的(之前)之外打開該文件,並在循環結束後關閉它。

0

這些文件的文件名格式au25-C2-benzalacetone.001高達2000

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

除了一個事實,即這條線是不完整的,你不能從1適合數字到三位數字的2000年。這可能是您的腳本沒有讀取所有文件的原因。