PERL FLIP -FLOP Operator - Emissione statale globale?
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.
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