Regex 带有正则表达式条件的Perl while循环似乎不会重新进入循环
我试图读取一个Regex 带有正则表达式条件的Perl while循环似乎不会重新进入循环,regex,perl,Regex,Perl,我试图读取一个diff文件,并将删除块(带前导-)和添加块(前导+)分组,我有以下内容,其中我希望有一个内部,而读取所有删除或添加,但不知何故,我发现在第一次匹配之后,循环似乎没有重新计算,也就是说,在一行与第32行上的条件匹配后,它进入循环,然后我将另一行读入$\uuz,但控制从循环转移到第36行,而不是重新进入循环并再次检查条件!(我已从调试器中选中) 27而(){ 28下一个if/^$/; 29下一个if/^[^-+]/#忽略非差异行 30口; 31我的$tmps=''; 32而(/^ \
diff
文件,并将删除块(带前导-
)和添加块(前导+
)分组,我有以下内容,其中我希望有一个内部,而
读取所有删除或添加,但不知何故,我发现在第一次匹配之后,循环似乎没有重新计算,也就是说,在一行与第32行
上的条件匹配后,它进入循环,然后我将另一行读入$\uuz
,但控制从循环转移到第36行
,而不是重新进入循环并再次检查条件!(我已从调试器中选中)
27而(){
28下一个if/^$/;
29下一个if/^[^-+]/#忽略非差异行
30口;
31我的$tmps='';
32而(/^ \-\/){读取整个块(所有以-
33$tmps.=getprintables($);
34$u35;=#读下一行
35 }
36推送(@prevs,$tmps)如果$tmps ne'';
37$tmps='';
38而(/^\+\/){读取整个块(所有以+
39$tmps.=getprintables($);
40 $_ = ;
41 }
42推送(@curs,$tmps),如果$tmps为ne“”;
43$tmps='';
44 }
45美元/小时;
我还尝试了较长的形式
while($\u=~ m/^\+\/)
,但结果相同。我看不出这里有什么问题。我有Perl v5.14.2
我建议只从单个while循环读取文件句柄,并使用状态变量执行附加逻辑
如果我正确地理解了您的意图,您可以重新设计您的方法,使用以下方法:
while (<$inh>) {
next if /^$/;
next if /^[^-+]/; # ignore non diff lines
chomp;
if ( my $range = /^- / .. !/^- / ) {
push @prevs, '' if $range == 1;
$prevs[-1] .= getprintables($_) if $range !~ /E/;
}
if ( my $range = /^\+ / .. !/^\+ / ) {
push @curs, '' if $range == 1;
$curs[-1] .= getprintables($_) if $range !~ /E/;
}
}
close($inh);
while(){
下一个if/^$/;
下一个if/^[^-+]/#忽略非差异行
咀嚼;
如果(我的$range=/^-/..!/^-/){
如果$range==1,则按@prevs';
$prevs[-1].=如果$range!~/E/;
}
如果(我的$range=/^\+/…!/^\+/){
如果$range==1,则按@curs';
$curs[-1].=如果$range!~/E/;
}
}
收盘价($inh);
@Miller,如果我想在同一行上匹配多次,那么我需要/g
,但这里我想在另一行上完全匹配。我可以重新写入循环,以确保从文件句柄只读取一次(但是,如果我们重新读取,是否会导致任何问题?)。我在sed
中使用了range,但这一个让我感到困惑!我尝试了这个,但它似乎没有读取整个块。好的,现在在尝试了一些range示例后,我得到了逻辑,将重新工作。
while (<$inh>) {
next if /^$/;
next if /^[^-+]/; # ignore non diff lines
chomp;
if ( my $range = /^- / .. !/^- / ) {
push @prevs, '' if $range == 1;
$prevs[-1] .= getprintables($_) if $range !~ /E/;
}
if ( my $range = /^\+ / .. !/^\+ / ) {
push @curs, '' if $range == 1;
$curs[-1] .= getprintables($_) if $range !~ /E/;
}
}
close($inh);