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
答案 0 :(得分:1)
我建议改变方法。而不是单独匹配线的特定部分,并且不得不一遍又一遍地执行此操作,而是在开始时对其进行标记。也就是说,将其分成语法部分。一旦解析完毕,就可以更容易地使用。
一个来自英语的例子,用于解析诸如"去商店","你去商店","我去了商店", "我们要到商店",您可以在不同的位置搜索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
应该在if
和else
之间,则还有另一个问题:if
条件中的正则表达式比{{1}中的正则表达式更正常条件。 elsif
会匹配CUSTEVSUMROW
或CUSTEVSUMMROW_GPRS
所有内容。交换CUSTEVSUMMROW_GPRS_SIMPLE
和if
块,以便在常规检查之前进行特定检查。
elsif