2012-02-20 9 views
0

私は、フリップフロップの演算子を使用して、いくつかのテキストの解析をしていますし、私のデータは以下のようになります。Perl Flip-Flopオペレータ - グローバル州問題?

COMMAND START 

CELL 
123 

COUNTER1 COUNTER2 COUNTER3 
23   25   45 

COUNTER1 COUNTER2 COUNTER3 
22   34   52 

CELL 
234 

COUNTER1 COUNTER2 COUNTER3 
12   35   35 

END 

今私がCOUNTER2の合計を見つけ、このデータによって、各セルのために反復処理する必要があります。各セルの下に、1つ以上のCOUNTER行があることがわかります。 私は以下のようなフリップフロップ演算子を使ってみましたが、動作しませんでした。

my ($CELL_ID_COL1, $TEMP_COUNT); 
my @line_contents; 

while (<>) { 
    chomp; 
    if(/^COMMAND.*START$/ .. /^END$/) { 

     if (my $e1 = /^CELL$/ ... (/^CELL$/ || /^END$/)) { 
      if ($e1 == 2) { 
       @line_contents = split(/\s+/, $_); #Split the line read on whitespaces 
       $CELL_ID_COL1 = $line_contents[0]; 
       print "$CELL_ID_COL1\n"; 
       $TEMP_COUNT = 0; 
      } 

      if (my $e2 = /^COUNTER1.*COUNTER3$/ ...(/^COUNTER1.*COUNTER3$/ || /^CELL$/ || /^END$/)) { 
       print "$_\n"; 
       if ($e2 ==2) { 
        @line_contents = split(/\s+/, $_); #Split the line read on whitespaces 
        $TEMP_COUNT += $line_contents[1]; 
       } 
       if ($e2 =~ /E0$/) { 
        redo; 
       } 

      } 
      if ($e1 =~ /E0$/) { 
       print "FINAL COUNT is: $TEMP_COUNT\n";    
       redo; 
      } 

     } 
    } 
} 

私がこのquestionで議論フリップフロップオペレータのグローバルな状態で何かを行うようになったと思いますが、あまり理解できませんでした。私を助けてください。

ありがとうございます。

答えて

5

フリップフロップがなければ簡単だと思います。時には、機能が行く方法だと思うこともありますが、問題にぶつかることがあります。代わりに、あなたは、ラウンド全体にそれを強制するまでの機能に固執する衝動に抵抗するのは、それを行うには、完全に別の方法を考える」

use Data::Dumper; 
use List::Util qw(sum); 

my %cells; 
my $cell_id; 
my $started; 

while(<DATA>) { 
    $started++ if /COMMAND START/; 
    next unless $started; 
    next if /\A\s*\z/; 
    last if /END/; 

    if(/CELL/) { 
     chomp($cell_id = <DATA>); 
     $index = 0; 
     } 

    if(/COUNTER/) { 
     my @counters = (<DATA> =~ /([0-9]+)/g); 
     $cells{$cell_id}[$index++] = \@counters; 
     } 
    } 

my %sums; 
foreach my $cell_id (keys %cells) { 
    $sums{$cell_id} = sum map { $_->[1] } @{$cells{$cell_id}} 
    } 

print Dumper(\%cells, \%sums); 

また、あなたが行くように合計を蓄積するために、これを変更することができます。

をそれでも、フリップフロップを使用する場合

しかし、あなたは助けをRespect the global state of the flip flop operatorMake exclusive flip-flop operators

+0

こんにちはブライアン、おかげで多くを読むことができます。あなたは私のサンプルコードに直面して問題が原因であるかどうかを確認してくださいでき'フリップフロップ演算子のグローバルな状態'の問題のみですか?ありがとうございます – pkr13

+0

私はあなたのコードが動作しない理由はわかりません私はエラーを追跡する時間を費やしたくなかった。 –