perl中elsif块中的正则表达式处理

时间:2014-09-10 18:20:11

标签: perl control-structure

GMF文件:

TSTARTCUSTEVSUMMROW_GPRS
CUSTEVSUMMROW_GPRS GPRS - Subscriber Package (Paygo)|93452|MB|240|33952
CUSTEVSUMMROW_GPRS GPRS - MBB Plan (Paygo)|93452|MB|160|20128
TENDCUSTEVSUMMROW_GPRS
TSTARTCUSTEVSUMMROW_GPRS_SIMPLE
CUSTEVSUMMROW_GPRS_SIMPLE GPRS - LTE Roam Package|1529551|MB|85|260536
CUSTEVSUMMROW_GPRS_SIMPLE GPRS - LTE Roam Package|65461|MB|20000|1309252
TENDCUSTEVSUMMROW_GPRS_SIMPLE

代码:

if ( $line =~ m/^(CUSTEVSUMMROW_SIMPLE|CUSTEVSUMMROW_GPRS_SIMPLE|CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW|CUSTPRODSUMMROW)\s(.*?)\|.*\|(.*?)$/) {
    $tag     = $1;
    $lineTxt = $2;
    $amt     = $3;
    if ( $tag =~ m/^(CUSTEVSUMMROW|CUSTEVSUMMROW_SIMPLE)/ ) {
        print "Processing some validations";
    } else {
        Print " Mapping failed";
    } elsif ( $tag =~ m/^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW_GPRS_SIMPLE)/ ) {
        if () {
            #It has to do some validations.
        } else {    
            #Failed;
        }
    }
}

当我尝试处理elseif条件无法处理时。你能帮我解决这个问题吗?

输出:

Unable to map:CUSTEVSUMMROW_GPRS | GPRS - Data Only LTE Package Roaming | 34646.2272
Unable to map:CUSTEVSUMMROW_GPRS | GPRS - LTE Dealer1 Package Roaming | 34609.3312
Unable to map:CUSTEVSUMMROW_GPRS_SIMPLE | GPRS - Simple Subscriber Package 3 | 32.1899
Unable to map:CUSTEVSUMMROW_GPRS_SIMPLE | GPRS - Simple Talk and Text Package | 0.2702

2 个答案:

答案 0 :(得分:1)

我建议改变方法。而不是单独匹配线的特定部分,并且不得不一遍又一遍地执行此操作,而是在开始时对其进行标记。也就是说,将其分成语法部分。一旦解析完毕,就可以更容易地使用。

一个来自英语的例子,用于解析诸如&#​​34;去商店","你去商店","我去了商店", "我们要到商店",您可以在不同的位置搜索go|going|went,或者您可以将其分解为主题(去),动词(您),对象(商店)然后与他们合作。

看起来你有一个|分隔的字段(你的帖子会在这个细节上发生冲突,根据需要进行调整)。在该管道上拆分以进行标记化。

my($tag, $description, $amount, $units, $limit, $something) = split m{\|}, $line;

现在您可以使用$tag而无需在整行上进行进一步的解析。

if( $tag eq 'CUSTEVSUMMROW' or $tag eq 'CUSTEVSUMMROW_SIMPLE' ) {
    ...
}
elsif( $tag eq 'CUSTEVSUMMROW_GPRS' or 'CUSTEVSUMMROW_GPRS_SIMPLE' ) {
    ...
}

通过将标记逻辑推入子例程,可以使代码更简单。

sub is_tag_of_type {
    my($tag, $type) = @_;

    return 1 if $type eq 'GPRS'   and $tag =~ /GPRS/;
    return 1 if $type eq 'SIMPLE' and $tag =~ /SIMPLE/;
    ...
}

或许标签有自己的小语法,可以分成标记。

sub tokenize_tag {
    my $tag = shift;

    my @tokens = split /_/, $tag;
    return map { $ _ => 1 } @tokens;
}

然后处理一行的代码就像这样。

my($tags, $description, $amount, $units, $limit, $something) = split m{\|}, $line;
my %tags = tokenize_tags($tags);

if( $tags{GPRS} ) {
    ...
}
else {
    ...
}

答案 1 :(得分:0)

编写if ... else ... elsif是一种语法错误 - 您的代码甚至无法运行。假设elsif应该在ifelse之间,则还有另一个问题:if条件中的正则表达式比{{1}中的正则表达式更正常条件。 elsif会匹配CUSTEVSUMROWCUSTEVSUMMROW_GPRS所有内容。交换CUSTEVSUMMROW_GPRS_SIMPLEif块,以便在常规检查之前进行特定检查。

elsif