2014-12-11 3 views
0

Я новичок в мире регулярных выражений, и у меня есть простая проблема (я думаю) извлечение информации из архива в perl. Этот архив имеет 200 000 строк приблиз и несколько строк имеет следующий форматизвлекающая подстрока с регулярным выражением в perl

WO  GB111MTD1     dddD-51 TIME 141202 0105 PAGE 1 

я хочу поместить в переменную GB111MTD1 и я знаю, что всегда слово «WO» является первым.

Что я попробовал следующий:

открыт (архив, "C: /Users/g/Desktop/c/alarms.log") или умереть "л \ п";

while(< archive>){ 
     if($_ =~ /^WO\s+(.*)/){ 
      print "Found: $1\n"; 
      last; 
     } 
} 

это печатает меня всю строку, я хочу только «GB111MTD1».

--- следующая цель

while(< archive>){ 
     if($_ =~ /^WO\s+(.*)\S/){ 
      print "Found: $1\n"; 
      last; 
     } 
} 

я хочу сказать, что здесь «если строка начинается с WO и имеют некоторые пробелы, совпадают со мной, что будет дальше, пока другие пробелы не найден»

здесь, единственное отличие состоит в том, что «1» из WO GB111MTD1 dddD-51 TIME 141202 0105 СТРАНИЦА 1 не отображается, но все еще не то, что я хочу

Надеюсь, вы понимаете мою проблему.

С уважением

+1

Необходимо уточнить свое «следующее намерение». Является ли 1 всегда в конце строки? – toolic

+0

Альтернативный подход состоит в том, чтобы рассматривать этот файл как файл CSV и читать его с помощью [Text :: CSV] (http://search.cpan.org/perldoc/Text::CSV_XS) или даже «ВЫБРАТЬ» вашу информацию с помощью [ DBD :: SQL] (http://search.cpan.org/perldoc/DBD::SQL). – reinierpost

ответ

4

Вы можете использовать \S для непробельных символов:

use warnings; 
use strict; 

while (<DATA>) { 
    if (/^WO\s+(\S+)/) { 
     print "Found: $1\n"; 
     last; 
    } 
} 

__DATA__ 
WO GB111MTD1 dddD-51 TIME 141202 0105 PAGE 1 

Печать:

Found: GB111MTD1 
1

Я хотел бы использовать разделение на строки, которые начинаются с WO.

use warnings; 
use strict; 

while (<DATA>) { 
    if (/^WO\s/) { 
     my @fields = split(/\s+/); 
     my $myvar = $fields[1]; 
     # do stuff with $myvar 
     say "Frobnicating order # $myvar"; 
    } 
} 

__DATA__ 
WO GB111MTD1 dddD-51 TIME 141202 0105 PAGE 1 
Смежные вопросы