Цикл рекурсивный через два файла в perl - PullRequest
0 голосов
/ 26 ноября 2018

Привет, ребята, у меня есть проблема, которую нужно решить,

У меня есть 2 файла.

Файл A col1, col2, value_total_to_put

File A 201843,12345,30

Файл B col1, col2, col3, value_inputted, missing_value, value_max

201843,12345,447,4,0,4
201843,12345,448,0,0,4
201843,12345,449,0,0,2
201843,12345,450,4,0,4
201843,12345,451,2,0,2
201843,12345,455,4,0,4
201843,12345,457,0,0,4
201843,12345,899,10,0,10
201843,12345,334,0,1,1
201843,12345,364,0,1,1
201843,12345,71,0,2,2
201843,12345,260,0,2,2
201843,12345,321,0,2,2
201843,12345,328,0,2,2
201843,12345,371,0,2,2
201843,12345,385,0,2,2
201843,12345,426,0,2,2
201843,12345,444,0,2,2
201843,12345,31,4,6,10
201843,12345,360,2,87,99
201843,12345,373,4,95,99
201843,12345,472,4,95,99
201843,12345,475,4,95,99
201843,12345,430,0,99,99
201843,12345,453,0,99,99
201843,12345,463,0,99,99
201843,12345,482,0,99,99
201843,12345,484,0,99,99

Мои ключи - col1 и col2 из обоих файлов, и я делаю это ниже, и мой цикл неверен, потому что, когда я достигаю EOF из файла B, мой циклостановился.То, что я хочу, это сопоставить файлы A и B с $ col1 и $ col2, и в то время как value_total_to_put составляет> 0, вывести 1 в каждом цикле и в value_inputted из файла B, когда значение value_inputted меньше значения value_max.Для извлечения из файла A отсутствующее_значение может быть> 0. Для результата я буду печатать, когда значение value_inputted равно value_max, другими словами, последнее значение до достижения значения value_max или value_total_to_put не равно 0.

while ( <FA> ){
        chomp;
        my($col1,$col2, $value_total_to_put) = split ",";
        push @A, [$col1,$col2, $value_total_to_put];
}

my @B;
while ( <FB> ){
        chomp;
        my($col1,$col2,$col3, $value_inputted, $missing_value, $value_max) = split ",";
        push @B, [$col1,$col2,$col3, $value_inputted, $missing_value, $value_max];
}


foreach my $line (@A){
        my $idxl = @$line[0].",".@$line[1];
        my $value_total_to_put = @$line[2];
        while ($value_total_to_put > 0){
                foreach my $row ( @B ){
                if ( $idxr eq $idxl ){
                        my $idxr = @$row[0].",".@$row[1];
                        my $value_inputted = @$row[3];
                        my $value_max = @$row[5];
                        my $missing_value = @$row[4];
                        if ( ($value_inputted eq 0) and ($missing_value eq 0)){
                                #do_nothing
                        } elsif($value_inputted == $value_max){
                                #do_nothing
                            print join(",", $idxr, @$row[2],"Value_inputted: ".$value_inputted, "Missing_value: ".$missing_value, "Value_max:".$value_max, "Total: ".$value_total_to_put)."\n";
                        }else{
                            $value_inputted++;
                            $missing_value--;
                            $value_total_to_put--;
                        }
                }
                }

        last if $value_total_to_put > 0;
        }
}

Третий файл будетбудь таким:

201843,12345,447,4,0,4
201843,12345,450,4,0,4
201843,12345,451,2,0,2
201843,12345,455,4,0,4
201843,12345,899,10,0,10
201843,12345,334,1,0,1
201843,12345,364,1,0,1
201843,12345,71,2,0,2
201843,12345,260,2,0,2
201843,12345,321,2,0,2
201843,12345,328,2,0,2
201843,12345,371,2,0,2
201843,12345,385,2,0,2
201843,12345,426,2,0,2
201843,12345,444,2,0,2
201843,12345,31,10,0,10
201843,12345,360,3,86,99
201843,12345,373,5,94,99
201843,12345,472,5,94,99
201843,12345,475,5,94,99
201843,12345,430,1,98,99
201843,12345,453,1,98,99

1 Ответ

0 голосов
/ 28 ноября 2018

Как объяснил @Dave Cross, ваш код довольно трудно читать (и он пропускает use strict и use warnings), а ваше объяснение того, чего вы пытаетесь достичь, совершенно неясно ...

Одна вещь, которая привлекла мое внимание, это то, что вы запускаете цикл с этим оператором ...

while ($value_total_to_put > 0){

... но в самом конце того же блока вы делаете:

    last if $value_total_to_put > 0;
}

Это фактически заставит Perl выйти из цикла после первой итерации, независимо от значения переменной $value_total_to_put.Это, вероятно, не то, что вы хотите.Следовательно, насколько я понимаю, вы должны начать свое расследование с удаления этого заявления last.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...