-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|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は構文エラーです。コードは実行されません。elsifが との間にあるifと仮定すると、else別の問題があります。条件の正規表現は、if条件の正規表現よりも一般的ですelsifCUSTEVSUMROWthatCUSTEVSUMMROW_GPRSまたはCUSTEVSUMMROW_GPRS_SIMPLEwould と一致します。ifブロックとブロックを交換しelsifて、特定のチェックが一般的なチェックの前に行われるようにします。

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