regex - Perl -- 执行 {read file} 直到找到正则表达式。找到匹配但没有跳出循环

标签 regex perl

我想读取一个文件来提取几行信息。我创建了一个 do .. until 来忽略文件行,直到我到达我真正感兴趣的部分,其中包含单词 V2000。我更喜欢使用通用正则表达式而不是寻找 V2000。

匹配已找到,但它没有打破 do .. until 循环,因此我无法提取紧随其后的信息

有人知道为什么吗?

do {$line = <IN_SDF>;} until ($line =~ m/V\d+/);

剩下的代码是:

my @aline = split ('', $line);
my $natoms = $aline[0];

my $out= shift;

do{
     <IN_SDF>;
     @aline = split ('', $_);

 print OUT_3D $aline[3]."\t".$aline[0]."\t".$aline[1]."\t".$aline[2]."\n";

} until --$natoms == 0;

最佳答案

你假设一个光秃秃的

<IN_SDF>

将从该文件句柄加载下一行到$_?那是不正确的。您只能通过 while 表达式获得该行为:

while (<IN_SDF>)    is equivalent to     while (defined($_=<IN_SDF>)) 

如果你是说

$_ = <IN_SDF>

那就这么说吧。


对于你问题的第一部分,这个成语:

while ($line = <IN_SDF>) {
    last if $line =~ m/V\d+/;
}

优于

do {
    $line = <IN_SDF>
} until $line =~ m/V\d+/;

因为当您用完输入时,后一个表达式将进入无限循环(并且 $line 变为未定义)。

关于regex - Perl -- 执行 {read file} 直到找到正则表达式。找到匹配但没有跳出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502693/

相关文章:

java - 如何使用正则表达式搜索字符串,并在找不到时返回空

python - 从 unicode 字符串中删除选定的标点符号

regex - 使用正则表达式和反向匹配,并将其通过管道传递给另一个命令

python - 负前瞻正则表达式贪婪(为什么.*?太贪婪)

perl - 我在哪里可以找到一些简单的 Perl W3C Validator API 信息?

python - 巨大的文本文件 (6Gb) 搜索和替换

regex - shell脚本中 "=~"运算符的含义

Javascript 正则表达式替换不起作用

regex - 过早退出 Perl File::Find

php - 使用 XSL、PHP、Perl、XML 近似 MVC。