2012-02-20 2 views
0

я делаю какой-нибудь текст синтаксический с помощью оператора триггера и мои данные выглядит следующим образом:Оператор Flip-Flop Perl - глобальный государственный вопрос?

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 operator и Make exclusive flip-flop operators

+0

Привет Брайан, Спасибо большое за помощь. можете ли вы подтвердить, если этот вопрос я столкнулся с моим кодом образца из-за «глобальное состояние флип-флоп-оператора»? С уважением – pkr13

+0

Я не знаю, почему ваш код не работает и я не хотел тратить время на отслеживание ошибки. –

 Смежные вопросы

  • Нет связанных вопросов^_^