Regex Perl——在找到正则表达式之前执行{readfile}。查找匹配项但不中断循环
我想读一个文件来提取几行信息。我已经创建了一个do。。直到我到达我真正感兴趣的部分,其中包含单词V2000,我才忽略文件行。我更喜欢使用通用正则表达式,而不是V2000 这场比赛找到了,但没有打破僵局。。直到循环,因此我无法提取紧随其后的信息 有人知道为什么吗Regex Perl——在找到正则表达式之前执行{readfile}。查找匹配项但不中断循环,regex,perl,Regex,Perl,我想读一个文件来提取几行信息。我已经创建了一个do。。直到我到达我真正感兴趣的部分,其中包含单词V2000,我才忽略文件行。我更喜欢使用通用正则表达式,而不是V2000 这场比赛找到了,但没有打破僵局。。直到循环,因此我无法提取紧随其后的信息 有人知道为什么吗 do {$line = <IN_SDF>;} until ($line =~ m/V\d+/); do{$line=;}直到($line=~m/V\d+/); 代码的其余部分是: my @aline = split (''
do {$line = <IN_SDF>;} until ($line =~ m/V\d+/);
do{$line=;}直到($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;
my@aline=split(“”,$line);
我的$natoms=$aline[0];
我的$out=班次;
做{
;
@aline=拆分(“”,$);
打印出\u 3D$aline[3]。“\t”。$aline[0]。“\t”。$aline[1]。“\t”。$aline[2]。\n”;
}直到--$natoms==0;
您是否假设
<IN_SDF>
如果你是说
$_ = <IN_SDF>
$\uuux=
那就说吧
关于你问题的第一部分,这个成语是:
while ($line = <IN_SDF>) {
last if $line =~ m/V\d+/;
}
while($line=){
最后一个if$line=~m/V\d+/;
}
比
do {
$line = <IN_SDF>
} until $line =~ m/V\d+/;
do{
$line=
}直到$line=~m/V\d+/;
因为当输入用完时,后一个表达式将进入无限循环(并且,
$line
变得未定义)。让我澄清一下
'V'
后跟任何数字李>
$natoms
,这是一个单位数,告诉您要扫描多少行至于您的跳出循环问题,当我运行该代码的一个版本时,它对我来说运行良好。有严格还是没有。我在解析一个破损的单行50MB XML文件时遇到了这个问题。我写了我自己的sub来做这件事,虽然我不知道它是否适用于原始海报:
sub ReadNext($$) {
my ($hh, $pattern) = @_;
my ($buffer, $chunk, $chunkSize) = ('', '', 512);
while(my $bytesRead = read($hh, $chunk, $chunkSize) > 0) {
$buffer .= $chunk;
if ($buffer =~ $pattern) {
my ($matchStart, $matchEnd) = (@-, @+);
my $result = substr($buffer, $matchStart, $matchEnd - $matchStart);
my $pos = tell($hh);
# Rewind the stream to where this match left off
seek($hh, ($pos -= length($buffer)-$matchEnd), 0);
return $result;
}
}
undef;
}
open(my $fh, $ARGV[0]) or die("Could not open file: $!");
while(my $chunk = ReadNext($fh, qr/<RECORD>.+?<\/RECORD>/)) {
print $chunk, "\n";
}
close($fh);
sub ReadNext($$){
我的($hh,$pattern)=@;
我的($buffer,$chunk,$chunkSize)=(“”,,,512);
而(my$bytesRead=read($hh,$chunk,$chunkSize)>0){
$buffer.=$chunk;
如果($buffer=~$pattern){
我的($matchStart,$matchEnd)=(@-,@+);
my$result=substr($buffer,$matchStart,$matchEnd-$matchStart);
我的$pos=告诉($hh);
#将流倒回到此比赛结束的位置
seek($hh,($pos-=length($buffer)-$matchEnd),0);
返回$result;
}
}
未定义;
}
打开(my$fh,$ARGV[0])或死亡(“无法打开文件:$!”;
而(my$chunk=ReadNext($fh,qr/+?/)){
打印$chunk,“\n”;
}
收盘价($fh);
对我来说,它用换行符打印XML中的每个记录元素
sub ReadNext($$) {
my ($hh, $pattern) = @_;
my ($buffer, $chunk, $chunkSize) = ('', '', 512);
while(my $bytesRead = read($hh, $chunk, $chunkSize) > 0) {
$buffer .= $chunk;
if ($buffer =~ $pattern) {
my ($matchStart, $matchEnd) = (@-, @+);
my $result = substr($buffer, $matchStart, $matchEnd - $matchStart);
my $pos = tell($hh);
# Rewind the stream to where this match left off
seek($hh, ($pos -= length($buffer)-$matchEnd), 0);
return $result;
}
}
undef;
}
open(my $fh, $ARGV[0]) or die("Could not open file: $!");
while(my $chunk = ReadNext($fh, qr/<RECORD>.+?<\/RECORD>/)) {
print $chunk, "\n";
}
close($fh);