perl中的正则表达式只打印第一个实例

时间:2014-06-27 01:14:47

标签: regex perl

我正在尝试逐行读取文件,如果一行包含来自正则表达式的内容,请打印该行。

my $file = 'test.txt';
open my $info, $file or die "Could not open $file: $!";

while( my $line = <$info>)  {
    if ($line =~ /\d\d\W\d\d\W\d\d/) {
        print $&;
    }
}

测试文件

        <td align='center'>0</td></tr><tr><td style='width:1px;padding:0px;'><img src='styles/images/cat/bluray.png' alt='Blu-ray'></td>
        <td><a href='details.php?id=313788&hit=1'><b>The.Raid.2.2014.1080p.BluRay.REMUX.AVC.DTS-HD.MA.5.1.RoSubbed...</b></a></td>
        <td align='center' style='width:1px;'><font class='small'>2014-06-27<br />03:39:15</font></td>
        <td align='center'>0</td>
        <td align='center'>0</td></tr><tr><td style='width:1px;padding:0px;'><img src='styles/images/cat/bluray.png' alt='Blu-ray'></td>
        <td><a href='details.php?id=313781&hit=1'><b>Rio.2.2014.Blu-ray.REMUX.1080p.AVC.DTS-HD.MA.7.1.RoSubbed-playBD</b></a></td>
        <td align='center' style='width:1px;'><font class='small'>2014-06-27<br />00:27:25</font></td>
        <td align='center'>48</td>
        <td align='center'>33</td></tr><tr><td style='width:1px;padding:0px;'><img src='styles/images/cat/hdtv.png' alt='HDTV'></td>
        <td><a href='details.php?id=313717&hit=1'><b>Cosmos. A Spacetime Odyssey 2014 1080p BluRay DD5.1 x264-DON</b></a></td>
        <td align='center' style='width:1px;'><font class='small'>2014-06-26<br />16:26:30</font></td>
        <td align='center'>19</td>

现在它只打印找到的第一个实例,文件中还有更多实例。如果我想打印$ line代替$&amp ;,它会打印文件的每一行,就像IF语句每次都是真的一样。

1 个答案:

答案 0 :(得分:0)

由于根据您的评论获得count=0,这意味着您实际上正在处理一行 - 您的文件会以100%的形式出现。

当输入记录分隔符$/与文件的行结束字符不匹配时,通常会发生这种情况,因为一个是Windows,一个是Unix:Unix换行符是"\n"字符,而DOS / Windows是"\r\n"

要修复,以下方法可行:

  1. 将文件从Unix转换为Windows格式(在Unix端,使用unix2dos命令)

  2. $/更改为"\n"

  3. 完全覆盖文件(使用my $data = File::Slurp::read_file($filename);),然后将"\n"字符上的$ data拆分为多行。