Perl Flip -Flop Operator - глобальный государственный вопрос?
Вопрос
Я делаю некоторый анализ текста, используя оператор 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 или более встречных строк. Я попытался использовать оператор шлепанца, как ниже, но он не работает.
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 );
Вы также можете изменить это, чтобы накапливать суммы по ходу дела.
Однако, если вы все еще хотите использовать флоп, вы можете прочитать Уважайте глобальное состояние оператора флопа а также Сделайте эксклюзивные операторы шлепанца