Perl - Concat 2特定移动顺序的文件

时间:2015-02-22 23:00:51

标签: perl file concat sequences

我有两个文本文件,内容几乎相同,行数相同。每个都有一个标题(第1行),后跟两个序列(由\ n分隔),标题再次(第4行),两个序列,再次标题(第7行),... 我要做的是写一个新文件C,它从文件A(行1..3)获取标题和序列,然后是文件B中的两个序列,文件A中接下来的3行,文件中接下来的两个序列B.它看起来像这样:

FILE C:
A1
A2
A3
B2
B3
A4
A5
A6
B5
B6
...

我的代码如下所示:

my $i = 0;
for my $j (0 .. $#FILE_A) {
    for (0 .. 2) {
        $FILE_C[$i] = $FILE_A[$j];
        $i++; $j++;
    }
    $i = $i + 2;
}

$i=3;
my $j=1;

for my $j (0 .. $#FILE_B) {
    for(0 .. 1) {
        $FILE_C[$i] = $FILE_B[$j];
        $i++; $j++;
    }
    $i = $i + 3;
    $j++;
}

它没有产生正确的输出,很难说出他混淆了哪条线。

1 个答案:

答案 0 :(得分:0)

问题在于

for my $j (0..$#FILE_A){

认为它负责让$j获取0$#FILE_A之间的每个值;但是你有这样的行:

$i++; $j++;

修改$j而没有for - 循环管理它。

由于你有这样一个简单的模式,每组的线数很少,我认为写这样的东西更简单:

my $i = 0;
for (my $i = 0, $j = 0; $j < @FILE_A; $i += 5, $j += 3) {
    # copy header:
    $FILE_C[$i] = $FILE_A[$j];
    # copy sequences from A:
    $FILE_C[$i + 1] = $FILE_A[$j + 1];
    $FILE_C[$i + 2] = $FILE_A[$j + 2];
    # copy sequences from B:
    $FILE_C[$i + 3] = $FILE_B[$j + 1];
    $FILE_C[$i + 4] = $FILE_B[$j + 2];
}