Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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——在找到正则表达式之前执行{readfile}。查找匹配项但不中断循环_Regex_Perl - Fatal编程技术网

Regex Perl——在找到正则表达式之前执行{readfile}。查找匹配项但不中断循环

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。。直到我到达我真正感兴趣的部分,其中包含单词V2000,我才忽略文件行。我更喜欢使用通用正则表达式,而不是V2000

这场比赛找到了,但没有打破僵局。。直到循环,因此我无法提取紧随其后的信息

有人知道为什么吗

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
    ,这是一个单位数,告诉您要扫描多少行
  • 然后你要扫描每一行并显示前4个字符
  • 对吗


    至于您的跳出循环问题,当我运行该代码的一个版本时,它对我来说运行良好。有严格还是没有。

    我在解析一个破损的单行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);