从Perl中的特定位置开始查找正则表达式匹配项

时间:2013-12-20 08:37:23

标签: regex perl

我有2个RegExps。如何获得第一个RegExp匹配子字符串的起始位置并开始从该位置找到第二个RegExp匹配?

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

3 个答案:

答案 0 :(得分:3)

您发送的$_while循环中没有变化,并且在脚本开始时定义为get()函数。

您需要捕获内容并发送$1才能运行。

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

旁注;大部分时间都比偏置$_更喜欢命名变量。如果你期望my $_ = ..全局的动态作用域,那么$_也会遇到麻烦,而词汇$_正在破坏它。

答案 1 :(得分:1)

你可以使用这样的东西

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

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

答案 2 :(得分: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;