Perl Flip -Flop Operator - глобальный государственный вопрос?

StackOverflow https://stackoverflow.com/questions/9361662

  •  28-10-2019
  •  | 
  •  

Вопрос

Я делаю некоторый анализ текста, используя оператор 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 или более встречных строк. Я попытался использовать оператор шлепанца, как ниже, но он не работает.

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;
            }

        }
    }
}

Я думаю, что это должно что-то сделать с глобальным состоянием оператора шлепанца, обсуждаемого в этом вопрос, но не мог многое понять. Помогите мне, пожалуйста.

Заранее большое спасибо.

Это было полезно?

Решение

Я думаю, что это проще без флопа. Иногда вы начинаете думать, что функция - это то, что нужно, но затем вы сталкиваетесь с проблемами. Вместо того, чтобы сопротивляться желанию придерживаться этой функции, пока вы не приведете его в круглый целый, рассмотрите совершенно другой способ сделать это »

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 );

Вы также можете изменить это, чтобы накапливать суммы по ходу дела.

Однако, если вы все еще хотите использовать флоп, вы можете прочитать Уважайте глобальное состояние оператора флопа а также Сделайте эксклюзивные операторы шлепанца

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top