Perl Flip -Flopオペレーター - グローバルな州の問題?
質問
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つ以上のカウンター列がある可能性があります。以下のようにFlip-Flopオペレーターを使用してみましたが、機能していません。
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 );
これを変更して、合計を蓄積することもできます。
ただし、フリップフロップを使用したい場合は、読むことができます フリップフロップ演算子のグローバルな状態を尊重します と 排他的なフリップフロップ演算子を作成します
所属していません StackOverflow