2013-12-20 51 views
0

我有2個RegExps。如何獲得第一個RegExp匹配子字符串的開始位置並開始從此位置查找第二個RegExp匹配?查找從Perl中特定位置開始的正則表達式匹配

UPD:例如:

$_ = " 
=cut 
vffdv 
vdfvfd 
vdfvfdvfd 
=pod 
dvfddv 
vfdvfdvf 
vdfvfdvfd 
=end 
"; 
$\ = "\n"; 

sub get { 
my $_ = shift; 
/=((\d|\w)+)/i; 
return $1; 
} 


print get($_) while /^=/mg; 

打印

cut 
cut 
cut 

但我需要

cut 
pod 
end 
+1

請參閱[這個答案](http://stackoverflow.com/a/1723458) – HamZa

+0

@HamZa但會有'='的列表。 'get'中的RegExp不起作用。 – michaeluskov

回答

3

你發送$_這不while循環改變,它在腳本開始時定義到get()函數。

您需要捕獲內容併發送$1才能運行。

print get($1) while /^=(.+)/mg; 

旁註;大多數時候確實比隱含的$_更喜歡命名變量。另外my $_ = ..如果您期待全球範圍內的動態作用域爲$_,並且詞彙$_正在對其進行破壞,那麼它會提出問題。

1

你可以使用這樣的事情

$_ = " 
=cut 
vffdv 
vdfvfd 
vdfvfdvfd 
=pod 
dvfddv 
vfdvfdvf 
vdfvfdvfd 
=end 
"; 

my @array = split /\n/ , $_; 
for (@array){ 
    if($_ =~ /^=/){ 
     print substr($_ , 1) . "\n"; 
    } 
} 
0

這就像我所需要的。

$_ = " 
=cut 
vffdv 
vdfvfd 
vdfvfdvfd 
=pod 
dvfddv 
vfdvfdvf 
vdfvfdvfd 
=fuck 
"; 
$\ = "\n"; 

sub get { 
my $_ = shift; 
my $start = shift; 
pos($_) = $start - 1; 
/=((\d|\w)+)/ig; 
return $1; 
} 


print get($_,pos $_) while /^=/mg;