繁体   English   中英

可以使用Perl的grep和regex返回捕获

[英]Possible to return capture using Perl's grep and regex

是否可以使用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

    你为什么用grep 这可能会做你想要的:

    my @hrefs = $examples_content =~ /href="(.*?)"/g
    

    有人在评论中已经提到过这一点,但是如果你正在处理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解析器,因此不会提取误报,例如文本中的类似内容(标记内部)。

    大多数其他人已经解决了mapsplit的问题,但你也需要小心使用正则表达式:

     my @hrefs = map {
          / \s href \s* = \s* (['"]) (.*?) \1 /ix ? $2 : ()
         } @lines;
    

    您可以看到不同的引号字符(或根本不显示),以及不区分大小写的标记和属性。 无论任何规范或标准说什么,很多东西都会产生混乱的HTML,许多浏览器都支持它。 我可能仍然错过那种模式中的东西。 这就是我编写模块的原因。

    grep可能是错误的工具。 试试$examples_content =~ /href="(.*?)"/g ...首先不需要split ,而且? 修饰符将保持href=".*"模式不匹配。

    map可以通过返回或不返回值来轻松模拟grep

    my @hrefs = map(/href="(.*?)"/g, split("\n", $examples_content));
    

    但我同意AmadanBRPocock的意见 ,在这种情况下删除分割并与源匹配将更好,但我添加了这个作为答案,向您展示如何将map用于其他情况。

    在不止一种方式的精神,行:

    my @hrefs = $examples_content =~ /href="(.*?)"/g;
    

    也可以写成:

    my @hrefs = map /href="(.*?)"/g, $examples_content;
    

    如果您更喜欢顺序[输出变换输入]而不是[输出输入变换]

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM