Оператор Perl Flip-Flop - глобальный государственный вопрос? - PullRequest
0 голосов
/ 20 февраля 2012

Я выполняю некоторый анализ текста с помощью оператора триггера, и мои данные выглядят следующим образом:

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

        }
    }
}

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

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

1 Ответ

5 голосов
/ 20 февраля 2012

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

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

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

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

...