截至目前,我有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),这样每次我都不必单独运行所有脚本更新我的文件。它们之间全部分离的原因是因为我不知道如何遍历文件名,并且对于每个文件名,分配一个新的输出文件。我希望有人可以帮我完成这个:一个脚本会一次读入所有文件,运行每个文件的脚本(它是一个相同的脚本),并为每个文件打印一个新的输出文件,如上所列。
编辑:我想我应该包括我现在拥有的东西。我确实有一些有用的东西,但它仍然依赖于我有22个单独的脚本这一事实。我一直在做的是:
system("perl script_1.pl");
system("perl script_2.pl");
...
system("perl script_22.pl");
我希望能够将所有内容组合成一个紧凑的脚本。任何帮助将不胜感激!提前谢谢!
答案 0 :(得分: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.out file2.out和file3.out。
这是一些非常基本的编程和一些非常基本的Perl。您应该备份并阅读一些开头的Perl书籍。我可以推荐最近出版的Curtis Poe's Beginning Perl。
答案 1 :(得分:1)
假设您有权访问Bash
:
$ for f in file_*.txt; do script.pl "$f" > "${f/file_/output_}"; done
这将为每个输入文件(file_n.txt)创建一个输出文件(output_n.txt)。如果使用简单名称(无空格等),则可以删除双引号
答案 2 :(得分:0)
自从我弯曲肌肉以来已经有一段时间了......但试着这样做可以消除你的问题。
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以获取inputfile和outputfile参数,而不是对其进行硬编码。
答案 3 :(得分:0)
system "script_$_.pl" for (1..22);