Domanda

Sto facendo un po 'di analisi del testo usando l'operatore flip-flop e i miei dati sembrano sotto:

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

Ora ho bisogno di iterare attraverso questi dati e per ogni cella, trovare la somma di Counter2. Sotto ogni cella come possiamo vedere potrebbero esserci 1 o più file di banco. Ho provato a usare l'operatore flip-flop come sotto, ma non funziona.

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

        }
    }
}

Penso che questo abbia dovuto fare qualcosa con lo stato globale dell'operatore flip-flop discusso in questo domanda, ma non riusciva a capire molto. Mi aiuti per favore.

Grazie mille in anticipo.

È stato utile?

Soluzione

Penso che sia più facile senza il flip flop. A volte inizi a pensare che una funzione sia la strada da percorrere, ma poi ti imbatti in problemi. Invece di resistere all'impulso di attenersi alla funzione fino a quando non la forza nel tutto rotondo, considera un modo completamente diverso per farlo "

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

Puoi anche modificarlo per accumulare le somme mentre procedi.

Tuttavia, se vuoi ancora usare il flip flop, puoi leggere Rispetta lo stato globale dell'operatore Flip Flop e Crea operatori esclusivi flip-flop

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top