正则表达式,用于解析perl中的多个文本

时间:2013-01-25 08:27:24

标签: perl multiline

我正在解析一个包含以下内容的输入文件。

   <tr>
 <th width="50%">ABC</th><th width="50%">XYZ</th>
   </tr>
   <tr>       
   <tr>
        <td>avc</td>
        <td>fds</td>
   </tr>

代码:

 #!/usr/bin/perl
 open(fh,$ARGV[0]) or die "could not open a file\n";
 $input=<fh>
 #print($input)
 if($input =~ /&lt;tr&gt;(\n)?(.*)(\n)?tr&gt;/)
 { 
     print($1);
 }

但没有输出。如何获得具有标签的中间线?

2 个答案:

答案 0 :(得分:3)

如果只阅读一行,如何匹配跨越多行的文本?也许您正在尝试加载整个文件,您可以执行以下操作;

my $input; { local $/; $input = <fh>; }

顺便说一句,请始终使用use strict; use warnings;

答案 1 :(得分:2)

看起来你只是在读第一行...

为什么不把你的代码放在while循环中?

(另外,通过设置$ /来获取entiere文件是一个更好的主意,因为你正在寻找一个匹配几行的模式)

此代码有效:

 #!/usr/bin/perl
 open(fh,$ARGV[0]) or die "could not open a file\n";
 {
    local $/;
    $input=<fh>;
    if($input =~ /&lt;tr&gt;\s*(.*)\s*&lt;\/tr&gt;/)
     { 
         print($1);
     }
    }

(请注意,我删除了\ n中没用的括号)

然而它不是很干净......

另外,你为什么不从:

开始
$input=~s/&lt/</g;
$input=~s/&gt/>/g;

哪个会帮助您的代码更具可读性?