2015-10-16 3 views
0

вход как GMF Файл:Perl шаблон регулярного выражения

CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package - Charged|3126|GB|7500000|234446 

В коде Perl, я использую ниже, чтобы извлечь строки из строки

if($line=~m/^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|.*\|(.*?)$/) 
{ 
    $tag=$1; 
    $lineTxt=$2; 
    $usage = $3; 
    $amt = $4; 
} 

выход:

tag :: CUSTEVSUMMROW_GPRS lineTxt :: GPRS - Nova Subscriber Non-Smartphone Package usage :: 3126 amt :: 
tag :: CUSTEVSUMMROW_GPRS lineTxt :: GPRS - Nova Subscriber Smartphone Package usage :: 3126 amt :: 
tag :: CUSTEVSUMMROW_GPRS lineTxt :: GPRS - Nova Subscriber Non-Smartphone Package - Charged usage :: 3126 amt :: 234446 

Как я могу получить/распечатать используемые единицы измерения - это MB или GB. Кто-нибудь, пожалуйста, помогите мне.

ответ

1

Учитывая то, что у вас там:

if($line=~m/^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|(.*?)\|(.*?)$/) 
{ 
    $tag=$1; 
    $lineTxt=$2; 
    $usage = $3; 
    $units = $4; 
    $amt = $5; 
} 

Но я бы предположить, что это не лучший способ подойти к этой проблеме - я бы подумал, используя split и обрабатывая ваше первое поле отдельно.

Что-то вроде этого, может быть:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use Data::Dumper; 

my @fields = qw (tag lineTxt usage units amt); 

while (<DATA>) { 
    my ($first_field, @record) = split '\|'; 

    #split the first field on _just_ the first space. 
    unshift(@record, $first_field =~ m/^(\w+) (.*)$/); 

    #use a hash slice to put that record into a hash of named keys. 
    my %data; 
    @data{@fields} = @record; 
    print Dumper \%data; 

    # can of course, make this an array of hashes quite easily. 
} 


__DATA__ 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Smartphone Package|3126|GB| | 
CUSTEVSUMMROW_GPRS GPRS - Nova Subscriber Non-Smartphone Package - Charged|3126|GB|7500000|234446 

Это печатает каждую запись как:

$VAR1 = { 
      'units' => 'GB', 
      'tag' => 'CUSTEVSUMMROW_GPRS', 
      'amt' => '7500000', 
      'usage' => '3126', 
      'lineTxt' => 'GPRS - Nova Subscriber Non-Smartphone Package - Charged' 
     }; 
+0

@ Sobrique..Thank вы так много .. – RAVJI

3

Вы не фиксируете столбец после \d+. Добавьте туда круглые скобки.

.*жадный, то есть он соответствует как можно больше. Добавить ?, чтобы сделать его скудный:

if ($line =~ /^(CUSTEVSUMMROW_GPRS|CUSTEVSUMMROW).*?\s(.*?)\|(\d+)\|(.*?)\|/) 

Вы также можете переписать альтернативу как

(CUSTEVSUMMROW(?:_GPRS)?) 
Смежные вопросы