【问题标题】:Perl Flip-Flop operator - Global State Issue?Perl 触发器运算符 - 全局状态问题?
【发布时间】:2012-03-10 19:48:04
【问题描述】:

我正在使用触发器运算符进行一些文本解析,我的数据如下所示:

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

        }
    }
}

我认为这与question 中讨论的触发器运算符的全局状态有关,但不能理解太多。请帮帮我。

非常感谢。

【问题讨论】:

    标签: perl flip-flop


    【解决方案1】:

    我认为没有人字拖会更容易。有时你开始认为一个功能是要走的路,但后来你遇到了问题。与其抗拒坚持使用该功能的冲动,直到将其强制为圆形,不如考虑一种完全不同的方式来做到这一点”

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

    您也可以修改它来累积总和。

    不过,如果你还想使用触发器,可以阅读Respect the global state of the flip flop operatorMake exclusive flip-flop operators

    【讨论】:

    • 嗨,布赖恩,非常感谢您的帮助。您能否确认我的代码示例所面临的问题是否仅是因为“触发器运算符的全局状态”问题?问候
    • 我不知道你的代码为什么不起作用,我也不想花时间去追查错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多