如何提取到哈希

时间:2011-01-07 16:25:02

标签: regex perl hash html-parsing

嘿,我不知道为什么我的代码不起作用。我试图从包含。

的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;

我错过了什么?

5 个答案:

答案 0 :(得分:4)

  1. 其他建议:您可能无法打开该文件。查看退货或使用autodie
  2. 扫描的HTML可能不是小写字母。使用i正则表达式标志。
  3. 根据HTML规则,并非所有属性值都需要引用。
  4. 另外,根据HTML规则,'='不必在属性名称之后或在值之前。
  5. 它们可能并不总是以相同的顺序出现或彼此相邻。
  6. 您正在使用正则表达式来解析HTML!
  7. #6是对3-5的问题的总结。我建议的解决方案是使用HTML::ParserHTML::TreeBuilder

答案 1 :(得分:2)

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

open LOGFILE, $file or die $!;

此外,正则表达式中可能不需要^锚点。

答案 2 :(得分:2)

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

  1. ^锚点会阻止您的正则表达式匹配,因为“id”不在 行的开头。
  2. 您可能正在重置%hash中的每个作业的数据 不是你想要的。
  3. 您正在打印键“id”的值,但您不会将其存储在哈希中。 您存储的内容(或者,如果模式匹配的话)将是 id属性。

答案 3 :(得分:1)

您不需要在开头<{1}}

试试这个^\s*

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

修改

尝试删除这些修饰符id\=\"(.*)\"\salt=\"(.*)\"

答案 4 :(得分:0)

这就是诀窍:

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。 :)