0

私は以下のステップを実行しています:

  • ディレクトリ内のすべてのテキストファイルを読み取り、@filesという名前の配列に保存します
  • 各テキストファイルでforeachループを実行します。分割操作を使用してファイル名(.txtの削除)を抽出し、その特定のファイル名のフォルダーを作成します。そのファイルの名前をTest.txtに変更します(別のperl実行可能ファイルの入力として機能するように)require"test.pl"という行を追加して各ファイルのtest.plを実行します。

1つのファイルに対してのみ正常に機能しますが、それ以上は機能しません。これが私のコードです:

opendir DIR, ".";
my @files = grep {/\.txt/} readdir DIR;

foreach my $files (@files) {

    @fn = split '\.', $files;
    mkdir "$fn[0]" 
        or die "Unable to create $fn[0] directory <$!>\n";

    rename "$files", "Test.txt";
    require "test3.pl";

    rename "Test.txt", "$files";
    system "move $files $fn[0]";
}

どんな助けでも非常にありがたいです。

4

2 に答える 2

6

このrequire関数は、コードがまだ読み込まれていない場合にのみ、スマートにコードを読み込もうとします。なぜこれが素晴らしいのですか?(1.) 条件付きインクルードを使用した C のプリプロセッサ地獄はありません。(2.) 時間を節約できます。

別の perl スクリプトを実行するには、さまざまな可能性があります。おそらくあなたが望むのはdo、スクリプトです。do FILENAME構文は eval と同じですが、スコープが ne ファイルから見えない点が異なりますdo

経由で別のインタープリターを開始することもできますsystem "./test3.pl"

test3.plたとえば、 を使用してモジュールを作成しpackage test3;、その内容を にパックすることができますsub。ファイル名をハードコーディングする代わりに、おそらく現在のファイル名を引数として渡します。これは、より優れたコーディング方法であるだけでなく、マルチスレッド化など、アプリケーションをより簡単にスケーリングできるようにします。

そのスニペットを実装する方法は次のとおりです。

use test3; # load the file once

foreach my $file (glob "*.txt") {   # use `glob` to get a list of matching filenames

    (my $newdir) = $file =~ m/^ (.+) \.txt $/x;  # what you probably wanted
    mkdir $newdir 
        or die "Unable to create $newdir directory <$!>\n";

    test3::the_sub($file); # do the action on $file, without renaming circus.
    system "move $file $newdir"; # rather use File::Copy
}
興味深い側面:

globシェルと同じように機能します。

my本当に正当な理由がない限り、常に変数に使用してください。

さらに、ファイルがディレクトリをtext.en.txt作成するべきではなく、ファイルが存在しないと仮定します。texttext.en.txt

これが機能するかどうかは、呼び出しているスクリプトによっても異なります。

于 2012-09-22T04:32:10.550 に答える
0

doの代わりに使用しrequireます。requireファイルを一度だけロードして実行します。

于 2012-09-22T04:15:00.457 に答える