【问题标题】:How to extract into hash如何提取成哈希
【发布时间】:2011-06-05 09:19:36
【问题描述】:

嘿,我不确定为什么我的代码不起作用。我正在尝试从包含的 html 文件中提取一些信息。

    Junk id="i_0100_1" alt="text1, text2 | text3" 
Junk Junk id="i_0100_2" alt="text1, text2 | text3"

我就是用这个来做的。

my $file = "page.html";

open (LOGFILE, $file);
my %hash;
while (my $line = <LOGFILE>)     
{ 
    %hash = $line =~ /^\s*id="([^"]*)"\s*alt="([^"]*)"/mg;
    print $hash{'id'};
}   
close LOGFILE;

我错过了什么?

【问题讨论】:

    标签: regex perl hash html-parsing


    【解决方案1】:
    1. 根据其他建议:您可能没有打开该文件。检查退货或使用autodie
    2. 扫描的 HTML 可能不是小写的。使用 i 正则表达式标志。
    3. 根据 HTML 的规则,并非所有属性值都需要引用。
    4. 同样根据 HTML 规则,'=' 不必紧跟在属性名称之后或值之前。
    5. 它们可能并不总是以相同的顺序出现或彼此相邻。
    6. 您正在使用正则表达式解析 HTML!

    #6 是对 3-5 问题的总结。我建议的解决方案是使用HTML::ParserHTML::TreeBuilder

    【讨论】:

      【解决方案2】:

      除了Axeman's suggestions(最重要的是不要自己解析HTML):

      1. ^ 锚将阻止您的正则表达式匹配,因为“id”不在 行首。
      2. 您在每次分配时重置%hash 中的数据,这可能 不是你想要的。
      3. 您正在打印键“id”的值,但没有将其存储在散列中。 您存储的(或将,如果模式匹配)是 value id 属性。

      【讨论】:

      • 第 1 点和第 2 点也有效。
      【解决方案3】:

      您应该始终检查打开文件的返回值:

      open LOGFILE, $file or die $!;
      

      另外,^ 锚点在正则表达式中可能是不必要的。

      【讨论】:

        【解决方案4】:

        你不需要在开头要求^\s*

        试试这个id\=\"(.*)\"\salt=\"(.*)\"

        演示http://rubular.com/r/ySG0XO5jbJ

        编辑

        尝试删除这些修饰符/mg

        【讨论】:

        • 如果/id=\"(.*)"\salt=\"(.*)\"/i 这不起作用,那么您的代码中还有其他问题。
        • 锚点 '^' 和修饰符 'mg' 是额外的。
        【解决方案5】:

        这成功了:

        my $file = "page.htm";
        
        open (LOGFILE, $file);
        my %hash;
        while (my $line = <LOGFILE>)     
        { 
            %hash = $line =~ /\s*id="([^"]*)"\s*alt="([^"]*)"/;
            for my $key ( keys %hash ) {
                my $value = $hash{$key};
                print "$key\n$value\n";
            }
        }   
        close LOGFILE;
        

        问题在于哈希输出和正则表达式定义。感谢 eugene、michael 和 ish。 :)

        【讨论】:

          猜你喜欢
          • 2012-02-19
          • 2013-01-23
          • 1970-01-01
          • 2020-07-21
          • 1970-01-01
          • 2010-12-19
          • 2023-03-16
          • 1970-01-01
          • 2021-06-25
          相关资源
          最近更新 更多