2010-06-10 3 views
4

У меня есть эта линияКак я могу заставить это регулярное выражение Perl работать?

/Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp" 

И я хочу, чтобы извлечь .\main.cpp. Я думал, что следующий будет делать трюк:

if($string =~ /.*\s+(.*)$/i) { 
print "matched ",$1,"\n"; 
} 

, потому что это же регулярное выражение работает в Ruby, и извлекает строку I требуется. Как я могу заставить его работать?

EDIT: вот как настроить мой строка:

for(find_indexes(\@lines,"/MDd")) { 
    my $actual_line = $lines[$_]; 
    $actual_line = modify($actual_line,$additional_defs); 
} 

find_indexes возвращает индексы строк, соответствующих любому из параметров после исх массива. Подменю modify вернет измененную версию отправленной ей строки, содержащую некоторые дополнительные определения.

EDIT2: вот modify суб:

sub modify { 
    my $string  = shift; 
    chomp($string); 
    my @defines  = @_; 
    if($string =~ /.*\s+(\".*?)$/) { 
     my $match = $1; 
     print "match is $match"; 
     my $string_copy = $string; 
     print "|$string_copy|\n"; 
    } 
} 

Суб не является полным, так как я не смог заставить его работать так, как надо. Я добавил дополнительную цитату в группе захвата, чтобы заставить ее соответствовать имени. Что-то странное происходит, хотя я бы ожидал, что печать $string_copy будет напечатана исходная строка, окруженная в |. Тем не менее, я получаю только ведущую трубу, а не конечную. Я подумал, что Perl интерпретирует интерполированное переменную неправильно, и я попытался сделать это следующим образом:

print "|",$string_copy,"|\n"; 

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

+0

Какой выход? –

+0

Выход «согласован». – Geo

ответ

2
my $string = '/Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp"'; 
if($string =~ /.*\s+(.*)$/i) { 
    print "matched ",$1,"\n"; 
} 

Это работает для меня и печатает matched .\main.cpp".

Просьба показать, как вы установили $string. Возможно, вы как-то перепутались с цитатами или чем-то еще.

EDIT: Возможно ли, что у вас есть символ \x0d в конце строки? Вы не заметили бы его в журнале при печати строки и chomp не удалит его:

my $string = '/Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp"' . "\x0d"; 
chomp $string; 
if($string =~ /.*\s+(.*)$/i) { 
    print "matched ",$1,"\n"; 
} 

Это печатает matched для меня, без захвата имя файла. Может, это твой случай?

C:\>perl --version 

This is perl, v5.10.1 built for MSWin32-x64-multi-thread 
+0

Теперь я разместил почти весь код. Есть идеи? – Geo

+0

OP сказал, что hes строит строку из файла. Теперь я могу воспроизвести его проблему. – sholsapp

+0

@gnucom, я только показываю некоторые трубы, как в | var | так что я могу видеть, есть ли строка с дополнительными символами :) – Geo

0

Попробуйте это:

#!/usr/bin/perl 

$string = <STDIN>; 
chomp($string); 
print $string; 

if($string =~ /.*\s+(.*)$/) { 
    print "\nmatched ",$1,"\n"; 
} 

Это Perl, v5.8.8 построен для i486-Linux-Гну-нить-мульти

+0

Он не соответствует строке. Я получаю тот же результат. – Geo

+0

Должно быть, как вы проходите в своей строке. Можете ли вы показать нам точную команду, которую вы используете? – sholsapp

+0

Я читаю строку из файла. Он должен быть автоматически сбежал, не так ли? – Geo

2

Ведущее .* не имеет смысла, так как это модификатор /i ,

Если строка заканчивается символом новой строки, это будет соответствовать \s+. Поскольку (.*), который следует за ним, ничего не может соответствовать, матч будет успешным, но $1 будет пустым.Вместо этого, заставить его соответствовать что-то: /(\S+)"$/

+0

Строка прерывается, прежде чем я попытаюсь сопоставить ее. – Geo

1

Это выглядит как все, что вы на самом деле хочу

$string =~ /(\S+)$/ 
+0

heh, yah, thats очиститель. – sholsapp

Смежные вопросы