2016-09-23 1 views
1

Я пытаюсь сделать сумму массива в моем Perl-коде, но я не смог получить правильный вывод.Perl array overriding

Вот мой пример кода

use File::Find::Rule; 
use Date::Parse; 

my ($dir, $type, $fh, $line, $str_1, 
    $str_2,$str_3, $str_4); 

my @array; 

$dir = '/dir/test/'; 
$type = '*'; 
$str_1   = 'somestr1'; 
$str_2   = 'somestr2'; 
$str_3   = 'somestr3'; 
$str_4   = 'somestr4'; 

my @files = File::Find::Rule->file()->name($type)->in($dir); 

open $out, '>>', "output_log" or die "Unable to open 'output_log' : $!"; 
print $out "\Logs \n"; 
print $out "--------------------------\n"; 
close $out or die "Unable to finish writing output_log : $!"; 

for my $file (@files) { 

    open $fh, '<', $file  or die "can't open $file: $!"; 
    open $out, '>>', "output_log" or die "Unable to open 'output_log' : $!"; 

    while ($line = <$fh>) { 

     if ($line !~ /$str_1/ && $line =~ /$str_2/) 
     { 
       @array = $somevar # result of this loop 2,3 
     } 

     if ($line !~ /$str_3/ && $line =~ /$str_4/) 
     { 
      @array = $somevar #result of this loop 2,3,4,5,6 
     } 


    } 

    close $out or die "Unable to finish writing output_log : $!"; 
} 

Так вот то, что я хочу

@array = (2,3,2,3,4,5,6) 
and sum of @array 

но Unfornately, если я распечатать этот массив, на котором выполняется каждую строку, но вместо этого я хочу написать цикл, который сохраняет результат в массиве из обоих блоков if. теперь код переопределяет @array во втором блоке if. Надеюсь, я сделал это ясно! Пожалуйста, помогите

+0

Надеюсь, что вы используете '' strict''' и 'use warnings' all'' в верхней части своей программы? Они важны в каждой программе Perl, которую вы пишете. И вы не должны объявлять все свои переменные в верхней части файла, поскольку это затрудняет поиск простых ошибок. Это было необходимо для очень старых компиляторов C, но я не могу придумать ни одного языка, где не лучше объявлять каждую переменную, где она впервые определена. – Borodin

ответ

3

@array = ... перезаписывает содержимое массива. Используйте push для добавления элементов в существующий массив.

Сумма, см. sum (или sum0) в List::Util.

+0

и из описания, похоже, им нужны два разных массива в цикле while, по одному для каждого, если условие – ysth