-1

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
4

2 回答 2

1

我建议改变方法。而不是单独匹配行的特定部分,并且必须一遍又一遍地这样做,而是在一开始就对其进行标记。也就是说,将其拆分为语法部分。一旦解析不碍事,使用起来会容易得多。

以英文为例,解析“Go to the store”、“You go to the store”、“I going to the store”、“We are going to the store”等内容,您可以go|going|went在各个位置进行搜索,或者您可以将其分解为主语 (go)、动词 (you)、宾语 (store),然后使用它们。

看起来您有一|组分隔的字段(您的帖子在此详细信息上存在冲突,请根据需要进行调整)。在该管道上拆分以进行标记。

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 {
    ...
}
于 2014-09-10T20:07:40.727 回答
0

写作if ... else ... elsif是一个语法错误——你的代码甚至不会运行。假设 theelsif应该在 theif和 the之间,else你还有另一个问题:条件中的正则表达式if比条件中的更通用elsifCUSTEVSUMROW将匹配任何CUSTEVSUMMROW_GPRS或将匹配的东西CUSTEVSUMMROW_GPRS_SIMPLE。交换ifelsif块,以便在一般检查之前进行特定检查。

if ($tag =~ /^CUSTEVSUMMROW_GPRS/) {
    ...
}
elsif ($tag =~ /^CUSTEVSUMMROW/) {
    ...
}
else {
    ...
}
于 2014-09-10T19:51:18.337 回答