2016-09-23 3 views
1

私のperlコードで配列の合計をしようとしていますが、正しい出力を得ることができませんでした。ここでPerl配列のオーバーライド

は私のサンプルコード

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、私が書きたいです両方のブロックから結果を配列に格納するループ。 ブロックは2番目のifブロックの@arrayをオーバーライドします。私はこれをクリアにしたいと思っています!助けてください

+0

あなたのプログラムの先頭に 'use strict'と' use warnings 'all''がありますか?あなたが書いたすべてのPerlプログラムには不可欠です。また、ファイルの先頭にすべての変数を宣言してはいけません。単純なバグを見つけにくいからです。これまでは非常に古いCコンパイラには必要でしたが、最初に定義された変数を宣言するのが良いわけではないので、今はどの言語も考えることができません。 – Borodin

答えて

3

@array = ...は、配列の内容を上書きします。既存の配列に要素を追加するには、pushを使用します。

合計については、のsum(またはsum0)を参照してください。

+0

と説明から、whileループで2つの異なる配列が必要なように聞こえるが、if条件ごとに1つ – ysth