0

フリップフロップ演算子を使用してテキスト解析を行っていますが、データは次のようになります。

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

ここで、このデータを反復処理する必要があり、各CELLについて、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;
            }

        }
    }
}

これは、この質問で説明したフリップフロップオペレーターのグローバルな状態と何か関係があると思いますが、あまり理解できませんでした。私を助けてください。

よろしくお願いします。

4

1 に答える 1

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

これを変更して、移動しながら合計を累積することもできます。

ただし、それでもフリップフロップを使用する場合は、「フリップフロップ演算子のグローバル状態を尊重する」および「排他的なフリップフロップ演算子を作成する」を読むことができます。

于 2012-02-20T14:29:03.407 に答える