2016-08-23 8 views
-1

私は2000の軌道ファイルを与えた分子動力学シミュレーションを実行しました。これらのファイルは、ファイル名の形式がau25-c2-benzalacetone.001(2000年まで)です。私は一般的なperlプログラムを作成しましたが、2000個のファイルを読み込むわけではありません。すべてのファイルを読み込み、各ファイルごとに個別に必要な座標を抽出するようにコードを変更するにはどうすればよいですか?私は2000のcoordinates_of_interest.datファイルが必要です。ティンカーファイルはau25-c2-benzalacetoneファイルです。ここで私が書いたコードは次のとおりです。ファイル形式はau25-c2-benzalacetone.001ある場合これらの変数を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の問題を与えている。グローバル・シンボル「の$ tinker_fileは」./extract_coordinates.plライン15で./extract_coordinates.pl線15 構文エラーで明示的なパッケージ名が必要です。 –

+0

は、私は私のコードにこれを追加すると、それは私に次のエラーを与える –

答えて

-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

を@DravSloanありがとう、近くの「$ tinker_file(」 –

+0

はたぶん私は間違って命名ファイルを実装しています。 –

+0

私はあなたはそれがそのスニペットにいろいろ書いていないので、まあ、私のコードは '$のtinker_file'が含まれていません –

0

、あなたの最初の問題は$iは3桁の数字ではないかもしれないということであるように思われます。あなたはおそらく私が気づい

my $tinker_file = sprintf "%s.%03d", $file1, $i;のような他の問題は、あなたが書き込みのために、「coordinates_of_interest.dat」オープニング保つということです追加していないので、最後のファイルだけがその三行を持つことになります何かをしたいです。すべての入力に対して1つのファイルに書き込む場合は、 forループの の外側にある(前)を開き、ループが完了した後に閉じてください。

0

これらのファイルは2000年さておき、この行が不完全であるという事実から

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

にファイル名の形式au25-C2-benzalacetone.001を持って、あなたは1から番号が収まりません3桁のフィールドでは2000になります。これはおそらく、あなたのスクリプトがすべてのファイルを読み込んでいないことが原因です。

関連する問題