我正在教自己Perl和我通过榜样学得最好。因此,我正在研究一个简单的Perl脚本,它擦除了一个特定的博客,并发现自己对几个正则表达式语句感到困惑。该脚本查找以下html块:
<dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
<dd>
<p>
[Content]
</p>
</dd>
... and so on.
这是我正在研究的示例脚本:
#!/usr/bin/perl -w
use strict;
use XML::RSS;
use LWP::Simple;
use HTML::Entities;
my $rss = new XML::RSS (version => '1.0');
my $url = "http://www.linux.org.uk/~telsa/Diary/diary.html";
my $page = get($url);
$rss->channel(title => "The more accurate diary. Really.",
link => $url,
description => "Telsa's diary of life with a hacker:"
. " the current ramblings");
foreach (split ('<dt>', $page))
{
if (/<a\sname="
([^"]*) # Anchor name
">
<strong>
([^>]*) # Post title
<\/strong><\/a><\/dt>\s*<dd>
(.*) # Body of post
<\/dd>/six)
{
$rss->add_item(title => $2,
link => "$url#$1",
description => encode_entities($3));
}
}
如果您有时间更好地帮助我理解,我的问题是:
以下行如何运作:
([^“] *)#锚名称
以下行如何运作:
([^>] *)#Post title
“六”在以下行中的含义是什么:
&LT; / DD&GT; / 6)
非常感谢您的帮助!我现在也正在研究自己问题的答案,但希望有人能给我一个推动力!
答案 0 :(得分:7)
以下行如何运作......
([^“] *)#锚名称
零或多个不是“,被捕获为$ 1,$ 2或其他什么的东西,取决于括号的数量(我们是。
以下行如何运作......
([^>] *)#Post title
零个或多个不是&gt;的东西,被捕获为$ 1,$ 2或其他任何东西。
“六”是什么意思 以下行...
&LT; / DD&GT; / 6)
x
也可以将注释放入正则表达式本身,因此# Post title
之类的内容只是注释。
有关更多/更好的信息,请参阅perldoc perlre。该链接适用于Perl 5.10。如果你没有Perl 5.10,你应该查看你的Perl版本的perlre文档。
答案 1 :(得分:2)
[^"]*
表示“任何不包含引号的零个或多个字符的字符串”。这被引号包围,形成一个带引号的字符串,类似于<a name=
[^>]*
与上面类似,它表示任何不包含>
的字符串。请注意,您可能需要[^<]
,以匹配下一个标记的开始<
,不包括实际开放。i
表示不区分大小写,不确定其余的。答案 2 :(得分:1)
代码是扩展的正则表达式。它允许您在正则表达式中放置空格和注释。请参阅perldoc perlre和perlretut。否则就像正常一样。
相同。