2013-01-08 84 views
1

截至目前,我有22個文件和22個獨立的文件,但每個文件都有相同的(在任務中)腳本。非常基本上,這是我有:(Perl)爲多個文件運行相同的代碼

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),所以我不必每次都分別運行所有腳本我更新我的文件。他們之所以分開的原因是因爲我不知道如何循環訪問文件名,併爲每個文件名分配一個新的輸出文件。我希望有人能夠幫助我完成這個:一次性讀取所有文件的腳本,爲每個文件運行腳本(這是一個相同的腳本),併爲每個文件打印出一個新的輸出文件,如上所列。

編輯:我想我應該包括我現在擁有的東西。我確實有一些工作,但它仍然依賴於我有22個獨立的腳本的事實。我一直在做的是以下幾點:

system("perl script_1.pl");

system("perl script_2.pl");

...

system("perl script_22.pl");

我希望能夠一切組合成一個緊湊的腳本。任何幫助將不勝感激!提前致謝!

+0

如果相同的腳本爲什麼不統一通過輸入和輸出文件名作爲[arguements](http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/)?而不是'script_1.pl',它應該是'./script.pl file_1.txt output_1.txt' –

回答

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 

而且它會讀取文件1,文件2和文件3,生產file1.out file2.out和file3.out。

這是一些非常基本的編程和一些非常基本的Perl。您應該備份並閱讀一些開始的Perl書籍。我可以推薦剛剛出來的Curtis Poe's Beginning Perl

+0

也許應該指定'process_file'應該包含主腳本的代碼,而不是'system(「腳本.pl $ input $ output「)'。 – TLP

+0

謝謝!是的,我剛剛開始因爲一個研究項目而開始使用Perl,所以我仍然有很多基本的東西需要我去理解。我一定會看看那本書! – Peter

1

假設你有Bash訪問:

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

這將爲每個輸入文件(file_n.txt)輸出文件(output_n.txt)。如果你使用簡單的名字(沒有空格等),你可以刪除雙引號。

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是我的1個統一腳本的愚蠢版本從`script_1.pl .. script_22.pl)。

該腳本需要修改以解析@Argv來獲取inputfile和outputfile參數,而不是對它們進行硬編碼。

0
system "script_$_.pl" for (1..22); 
相關問題