2013-02-08 5 views
0

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

Необходимых данные в $ инфо переменный, из которой я хочу, чтобы получить полезные данные

my $info = "random text i do not want\n|BIRTH PLACE=Boston, MA\n|more unwanted random text"; 

полезные данными в строке выше являются Boston, MA. Я удалил строки из строки на $info =~ s/\n//g;. Теперь $info имеет эту строку "random text i do not want|BIRTH PLACE=Boston, MA|more unwanted random text". Я думал, что это поможет мне легко получить требуемые данные.

Пожалуйста, помогите мне в получении необходимых данных. Я уверен, что данным всегда будет предшествовать |BIRTH PLACE= и сменяется |. Все до и после этого является нежелательным текстом. Если вопрос, подобный этому, уже ответил, пожалуйста, направьте меня к нему. Благодарю.

ответ

1
$info =~ m{\|BIRTH PLACE=(.*?)\|} or die "There is no data in \$info?!"; 
my $birth_place = $1; 

Это должно сделать трюк.

+0

Это один работал как шарм. Благодарю. – SagarG

3

Вместо того чтобы заменить все вокруг, вы можете найти /\|BIRTH PLACE=([^\|]+)\n\|/, [^ \ |] +, являющийся одним или несколькими из anything that is not a pipe.

1

Вы знаете, на самом деле эти новые строки могли вам помочь. Я пошел бы на первоначальное регулярное выражение:

/^\|BIRTH PLACE=(.*)$/m 

Использования многострочного модификатора (m), чтобы соответствовать ^ в начале строки и $ в конце, а не просто совпадение с началом и конец строки. Черт возьми, вы даже можете получить действительно сумасшедшие и матч:

/(?<=^\|BIRTH PLACE=).+$/m 

Чтобы захватить только ту информацию, которую вы хотите, используя ((?<= ...) назад '), чтобы утверждать, что это информация о месте рождения.

Зачем прокручивать строку дважды, когда вы можете сделать это один раз?

Так, в Perl:

if ($info =~ m/(?<=^\|BIRTH PLACE=).+$/m) { 
    print "Born in $&.\n"; 
} else { 
    print "From parts unknown"; 
} 
1

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

use strict; 
use warnings; 

use autodie; 

open my $fh, '<', 'myfile'; 

my $pob; 
while (<$fh>) { 
    if (/BIRTH PLACE=(.+)/) { 
    $pob = $1; 
    last; 
    } 
} 

print $pob; 

выход

Boston, MA 
Смежные вопросы