如何使用Perl多次运行相同的命令?

时间:2015-05-15 07:18:38

标签: perl

我有两个命令,我需要为两组数据重新运行16次。我标记了用作文件#a1_100.gen(设置1)和文件#a2_100.gen(设置2)的文件。然后将100替换为100到1600的倍数(100,200,......,1000,...,1600)。

示例1:对于第一组

命令1:perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_100.gen file#a1_100.out

命令2:perl my program2.pl file#a1_100.out file#a1_100.out.long

示例2:对于第一组

命令1:perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_200.gen file#a1_200.out

命令2:perl my program2.pl file#a1_200.out file#a1_200.out.long

对于第1组和第2组,这两个命令重复16次。对于第2组,文件名更改为文件#a2 ...

我需要一个可以自行运行的命令,方法是更改​​2组的文件名,每组运行16次。

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

这可能是使用shell脚本最容易完成的。与Perl,TMTOWTDI一样 - 有不止一种方法可以做到这一点。

for num in $(seq 1 16)
do
    perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_${num}00.gen file#a1_${num}00.out
    perl myprogram2.pl file#a1_${num}00.out file#a1_${num}00.out.long
done

(您可以使用{1..16}代替$(seq 1 16)来生成数字。您可能还会注意到文件名中的#字符会破坏SO Markdown系统。)

或者您可以使用:

for num in $(seq 100 100 1600)
do
    perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_${num}.gen file#a1_${num}.out
    perl myprogram2.pl file#a1_${num}.out file#a1_${num}.out.long
done

(我不认为那里有{...}扩展。)

或者,更好的是,您可以使用变量来保存值以避免重复:

POS="file#a1.pos"
ABC="abc#a1.ref"
XYZ="xyz#a1.ref"

for num in $(seq 100 100 1600)
do
    PFX="file#a1_${num}"
    GEN="${PFX}.gen"
    OUT="${PFX}.out"
    LONG="${OUT}.long"
    perl myprogram1.pl "${POS}" "${ABC}" "${XYZ}" "${GEN}" "${OUT}"
    perl myprogram2.pl "${OUT}" "${LONG}"
done

在此代码中,参数名称周围的大括号都是可选的;在第一个代码块中,${num}周围的大括号是强制性的,但在第二个大小写中是可选的。用双引号括起名字在这里也是可选的,但建议使用。

或者,如果你必须在Perl中这样做,那么:

use warnings;
use strict;

my $POS = "file#a1.ref";
my $ABC = "abc#a1.ref";
my $XYZ = "xyz#a1.ref";

for (my $num = 100; $num <= 1600; $num += 100)
{
    my $PFX = "file#a1_${num}";
    my $GEN = "${PFX}.gen";
    my $OUT = "${PFX}.out";
    my $LONG = "${OUT}.long";
    system("perl", "myprogram1.pl", "${POS}", "${ABC}", "${XYZ}", "${GEN}", "${OUT}");
    system("perl", "myprogram2.pl", "${OUT}", "${LONG}");
}

这都是非常基本的编码。你可以猜测,从最后一个shell脚本生成这个内容并没有花太多时间。请注意在system调用中使用多个单独的字符串代替一个长字符串。这避免了运行shell解释器 - Perl直接运行perl

您可以使用$^X代替"perl"来确保运行与运行显示的脚本相同的Perl可执行文件。 (如果/usr/bin/perl上有PATH,但您运行$HOME/perl/v5.20.1/bin/perl thescript.pl,则差异可能很重要,但可能不会。)