是否可以使用Perl的grep函数返回正则表达式的捕获部分?我有以下代码:
use LWP::Simple;
my $examples_content = get('http://example.com/javascript/reports/examples/');
my @hrefs = grep(/href="(.*)"/, split("\n", $examples_content));
print $hrefs[0];
打印的内容是:
当我想要的时候:simple_chart.html
答案 0 :(得分:6)
您为什么使用grep
?这可能会做你想要的:
my @hrefs = $examples_content =~ /href="(.*?)"/g
答案 1 :(得分:4)
有人已经在评论中提到过这一点,但如果你正在处理HTML,我有一个提取链接的模块。如果您不介意依赖HTML :: Parser,那么这不是一个糟糕的小工具:
use HTML::SimpleLinkExtor;
my $extor = HTML::SimpleLinkExtor->new;
$extor->parse($html);
@a_hrefs = $extor->a; # by tag
@hrefs = $extor->href; # by attribute
我主要使用这个模块来快速和肮脏的工作。由于它使用真正的HTML解析器,因此不会提取误报,例如文本中的类似内容(标记内部)。
大多数其他人已经使用map
和split
解决了这些问题,但您也需要谨慎使用正则表达式:
my @hrefs = map {
/ \s href \s* = \s* (['"]) (.*?) \1 /ix ? $2 : ()
} @lines;
您可以看到不同的引号字符(或根本不显示),以及不区分大小写的标记和属性。无论任何规范或标准说什么,很多东西都会产生混乱的HTML,许多浏览器都支持它。我可能仍然错过那种模式中的东西。这就是我编写模块的原因。
答案 2 :(得分:3)
grep
可能是错误的工具。首先尝试$examples_content =~ /href="(.*?)"/g
...首先不需要split
,而?
修饰符会使href=".*"
模式与匹配过多。
答案 3 :(得分:3)
map
可以通过返回或不返回值轻松模拟grep
:
my @hrefs = map(/href="(.*?)"/g, split("\n", $examples_content));
但我同意 Amadan 和 BRPocock ,在这种情况下删除拆分并与源匹配将更好,但我添加了这个作为show的答案你如何将map
用于其他案件。
本着不止一种方式的精神,行:
my @hrefs = $examples_content =~ /href="(.*?)"/g;
也可以写成:
my @hrefs = map /href="(.*?)"/g, $examples_content;
如果您更喜欢订单 [输出转换输入] 而不是 [输出输入转换]