0

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

   <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);
 }

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

4

2 回答 2

3

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

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

顺便说一句,总是使用use strict; use warnings;

于 2013-01-25T08:29:20.700 回答
2

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

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

(此外,通过将 $/ 设置为 '' 来获取整个文件是一个更好的主意,因为您正在寻找匹配多行的模式)

此代码有效:

 #!/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;

这将有助于您的代码更具可读性?

于 2013-01-25T08:29:43.287 回答