2014-09-10 119 views
-1

GMF文件中ELSIF塊處理:正則表達式在Perl

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 
+3

帶'if()... else ... elsif()...'的代碼永遠不能執行elsif部分。它將執行前兩個條款之一。 – AdrianHHH 2014-09-10 18:51:33

+1

您的輸出與您的輸入不符。在你的輸出中,標籤和標籤之間有一個「|」。你的輸入和代碼說有一個空間。 – Schwern 2014-09-10 19:58:51

回答

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 { 
    ... 
} 
0

if ... else ... elsif是一個語法錯誤 - 你的代碼將不能運行。假設elsif應該在ifelse之間,那麼您還有一個問題:if條件中的正則表達式比elsif條件中的正則表達式更普遍。 CUSTEVSUMROW將匹配任何CUSTEVSUMMROW_GPRSCUSTEVSUMMROW_GPRS_SIMPLE會。交換ifelsif塊,以便特定檢查在通用之前進行。

if ($tag =~ /^CUSTEVSUMMROW_GPRS/) { 
    ... 
} 
elsif ($tag =~ /^CUSTEVSUMMROW/) { 
    ... 
} 
else { 
    ... 
} 
+0

或者用一個像文字邊界('\ b')的錨點。 – Axeman 2014-09-10 22:28:39