1

現在のところ、22個のファイルがあり、22個の別々の、しかし(タスクでは)同一のスクリプトが各ファイルにあります。非常に基本的に、これは私が持っているものです:

file_1.txt, file_2.txt,..., file_22.txt

ファイルごとに、次のスクリプトがあります。

script_1.pl, script_2.pl,..., script_22.pl

その出力

output_1.txt, output_2.txt,..., output_22.txt

それぞれ。

私が今やろうとしているのは、すべてのスクリプト(script_1.pl --script_22.pl)を同時に実行するスクリプトを作成することです。これにより、ファイルを更新するたびにすべてのスクリプトを個別に実行する必要がなくなります。 。それらがすべて別々である理由は、ファイル名を循環する方法がわからないためです。ファイル名ごとに、新しい出力ファイルを割り当てます。誰かがこれを正確に手伝ってくれることを願っています:すべてのファイルを一度に読み込み、各ファイルのスクリプトを実行し(1つの同一のスクリプトです)、各ファイルに対して新しい出力ファイルを印刷します、上記のように。

編集:私は今持っているものを含めるべきだと考えました。私はうまくいくものを持っていますが、それでも私が22の別々のスクリプトを持っているという事実に依存しています。私がやってきたことは次のとおりです。

system("perl script_1.pl");

system("perl script_2.pl");

...

system("perl script_22.pl");

すべてを1つのコンパクトなスクリプトにまとめられるようにしたいと思います。どんな助けでも大歓迎です!前もって感謝します!

4

4 に答える 4

4

からプログラム引数のリストを取得して@ARGV、コードをforループで実行できます。

for my $input_file (@ARGV) {
    my $output_file = $input_file.".out";

    process_file($input_file, $output_file);
}

sub process_file {
    my($input_file, $output_file) = @_;

    ...do whatever you like with the input and output file...
}

次に、次のようにプログラムを実行できます。

myprogram file1 file2 file3

そして、file1、file2、file3を読み取り、file1.outfile2.outとfile3.outを生成します。

これはかなり基本的なプログラミングであり、かなり基本的なPerlです。おそらく、バックアップして、Perlの最初の本を読む必要があります。最近発売されたCurtisPoeのBeginningPerlをお勧めします。

于 2013-01-08T04:39:34.947 に答える
1

あなたがにアクセスできると仮定してBash

$ for f in file_*.txt; do script.pl "$f" > "${f/file_/output_}"; done

これにより、すべての入力ファイル(file_n.txt)の出力ファイル(output_n.txt)が作成されます。単純な名前(スペースなしなど)を使用する場合は、二重引用符を削除できます。

于 2013-01-08T04:44:40.613 に答える
0

私がperlの筋肉を曲げてからしばらく経ちましたが、これを試して問題を解消してください。

for(my $index= 1,$index<=22,$index++){
   my $inputfile = "file_$index.txt";
   my $outputfile = "output_$index.txt";

   system("perl OneScriptToRuleThemAll.pl $inputfile $outputfile");
}

OneScriptToRuleThemAll.pl`script_1.pl..script_22.plからの1つの統合スクリプトの私の間抜けなバージョンはどこにありますか。

@Argvを解析して、入力ファイルと出力ファイルのパラメーターをハードコーディングするのではなく、それらを取得するようにスクリプトを変更する必要があります。

于 2013-01-08T04:45:12.443 に答える
0
system "script_$_.pl" for (1..22);
于 2013-01-09T02:14:16.393 に答える