Perl - 在找到正则表达式之前执行{read file}.查找匹配但不会突破循环

Mer*_*llo 2 regex perl

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

匹配被找到,但它没有突破do .. until循环,因此我无法提取紧接着之后的信息

有谁知道为什么?

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

其余的代码是:

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;
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 14

你假设是裸露的吗?

<IN_SDF>
Run Code Online (Sandbox Code Playgroud)

将从该文件句柄加载下一行到$_?那是不对的.您只能使用while表达式获得该行为:

while (<IN_SDF>)    is equivalent to     while (defined($_=<IN_SDF>)) 
Run Code Online (Sandbox Code Playgroud)

如果你的意思是

$_ = <IN_SDF>
Run Code Online (Sandbox Code Playgroud)

然后说出来.


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

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

比较好

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

因为后一个表达式将在输出用完时进入无限循环(并$line变为未定义).