Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带有正则表达式条件的Perl while循环似乎不会重新进入循环_Regex_Perl - Fatal编程技术网

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);