perl regex跳过一条线

时间:2011-11-13 05:36:05

标签: regex perl file-io

我正在尝试将一个正则表达式字符串与perl中的数据文件进行匹配,但是它一直在跳过我要前往的确切行......这里可能出错的是什么?

我的文件说:

<div class="definitionBox details" id="id-udt">
<span class="stempel">Udtale</span>
<span class="tekstmedium allow-glossing">
<span class="lydskrift"><span class="diskret">[</span>be&#712;g&#248;n&#704;&#601;<span class="diskret">]</span></span>
</span>

我要上课“lydskrift”,所以我试图以多种方式获取其内容,直到我最终试图匹配所有这样的内容:

while (<FILE>) {
    if ( <FILE> =~ m/(.+)/ ) {
        open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
        print (FARA $1 . "\n");
        close (FARA);
    }
}

令人惊讶的是它不断给我这个:

<div class="definitionBox details" id="id-udt">
<span class="tekstmedium allow-glossing">
</span>

有趣的是,如果我将它们放在同一个perl文件中的DATA区域,它会匹配所有四行!但这不是我想要的,那么是什么让这里有所不同呢?

2 个答案:

答案 0 :(得分:4)

首先,我认为你的文件在顶部还有一行,你不包括在内。我怀疑的原因如下。

您的问题不是正则表达式,您的问题是<FILE>每次调用它时都会读取一行。因此,每次循环都会在while(<FILE>)中读取一行,然后在if(<FILE> =~ m/(.+)/)中读取另一行。您的if就是这样:

if(m/(.+)/)

以便它使用$_将填充的默认while(<FILE>)变量。

此外,您的while循环正在完成比以往更多的工作,您可以这样做:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
while(<FILE>) {
    print FARA;
}
close (FARA);

甚至是这样:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
print FARA while(<FILE>);
close (FARA);

如果你想跳过空白行,那么可能就是这样:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
while(<FILE>) {
        chomp;
        print FARA $_, "\n" if($_);
}
close (FARA);

答案 1 :(得分:2)

要构建mu is too short's solution,这就是我写它的方式:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt' or die $!;
while (<FILE>) {
        print FARA if /./;
}
close FARA;

或者,如果您还想跳过仅包含空格的行:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt' or die $!;
while (<FILE>) {
        print FARA if /\S/;
}
close FARA;