2011-01-07 45 views
0

嘿,我不知道为什么我的代码不起作用。我试图从包含的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; 

我在想什么?

回答

2

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

  1. ^锚会阻止你的正则表达式的,因为“ID”匹配不在该行的起始位置 。
  2. 您正在重置%hash中的每个作业的数据,这可能不是您想要的 。
  3. 您正在输出密钥“id”的值,但不会将其存储在散列中。 您存储的内容(或者如果该图案曾经匹配过)将是 id属性的
1

你需要不需要^\s*在开始

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

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

编辑

尝试删除这些修饰/mg

+0

不行.......... – nebulus 2011-01-07 16:36:18

+0

它不起作用。不行。 – nebulus 2011-01-07 16:40:00

+0

不起作用... – nebulus 2011-01-07 16:47:59

2

您应经常检查返回值从打开文件:

open LOGFILE, $file or die $!; 

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

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

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

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