我正在解析一个包含以下内容的输入文件。
<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 =~ /<tr>(\n)?(.*)(\n)?tr>/)
{
print($1);
}
但没有输出。如何获得具有标签的中间线?
答案 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 =~ /<tr>\s*(.*)\s*<\/tr>/)
{
print($1);
}
}
(请注意,我删除了\ n中没用的括号)
然而它不是很干净......
另外,你为什么不从:
开始$input=~s/</</g;
$input=~s/>/>/g;
哪个会帮助您的代码更具可读性?