2011-01-07 60 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。 :)