2015-09-23 3 views
2

Я пытаюсь извлечь определенную строку чисел из текстового файла, используя регулярную экспрессию, но когда мой код работает, он захватывает числа после косой черты в разделении между датой и временем. Вот что я до сих пор.Perl Экземпляр регулярного выражения

while (<INFILE>) { 

    my @fields = split(/\ /, $_); 
    my @output; 

    foreach my $field (@fields) { 
     if ($field =~ /[0-9]{5}\//) { 
      push @output, $field; 
     } 
    } 

    if (@output) { 
     my $line = join(' ', @output); 
     print "$line\n"; 
     print OUTFILE "$line\n"; 
    } 
} 

Линия Я пытаюсь извлечь данные из является

D20/2004 254/1944 254/2041 15254/2011 ALL-V4YM 001 AUTO C-C0000 

данные мне нужно, это 15254, но когда я запускаю мой код возвращает 15254/2011 и моя программа erroring вне.

ответ

4

Проблема заключается в том, что вы сохраняете весь массив $field в выходном массиве, но хотите сохранить только число слева от косой черты. Вы можете использовать скользящие круглые скобки в регулярном выражении и специальную переменную . Это выводит 15254:

use warnings; 
use strict; 

while (<DATA>) { 
    my @fields = split(/\ /, $_); 
    my @output; 
    foreach my $field (@fields) { 
     if ($field =~ /^([0-9]{5})\//) { 
      push @output, $1; 
     } 
    } 
    if (@output) { 
     my $line = join(' ', @output); 
     print "$line\n"; 
    } 
} 

__DATA__ 
D20/2004 254/1944 254/2041 15254/2011 ALL-V4YM 001 AUTO C-C0000 
+1

Я хотел бы предложить добавить начало лин e anchor к вашему выражению, чтобы вы не захватили поле, если в нем больше пяти цифр. '/^([0-9] {5}) \ //' –

+0

@TrentonTrama: Хорошая идея. Обновлено. – toolic

+0

Вы также можете использовать 'my ($ value) = $ field = ~ m,^(\ d {5}) \ /,;' если вам не нравится '$ 1'. – Sobrique

1

Как упоминалось выше, вы спасаете весь поле в @output, если он совпадает с регулярным выражением, а не только первой части перед косой чертой

Ваш split также излишне сложным, и join не требуется

Все, что вам нужно это

while (<INFILE>) { 

    my @output = map m{^([0-9]{5})/}, split; 

    if (@output) { 
     print "@output\n"; 
     print OUTFILE "@output\n"; 
    } 
} 
Смежные вопросы