2016-07-05 39 views
0

我的perl腳本有點問題。我試圖將HTML文件的內容轉換爲CSV。這部分不是問題。我正在爲2個HTML文件做同樣的事情,並期待2個CSV文件。除了1件事外,一切都很好。第一個CSV文件非常好,但第二個CSV文件包含第一個PLUS文本的第二個文本....我粘貼了我的腳本並刪除了數據提取和HTML下載的行。所以下面的其餘部分是純文件處理...我在這裏失蹤什麼?文件關閉不起作用

#!/usr/bin/perl 

.. 
my $saveFileName = "x"; 
my $saveCsvName = "x"; 

sub parse_page{  
    open(CSV, ">".$saveCsvName); 
    my $tree = HTML::TreeBuilder->new(); 
    $tree->parse_file($saveFileName); 
    my @adds = $tree->look_down(sub { lc($_[0]->attr('class')) eq 'ad_row' }); 
    foreach $add(@adds){ print CSV $stuff."\n"; } #do stuff and print 
    $tree->delete; 
    close(CSV); 
} 

# Main ----------------------------------------------------- 
$saveFileName = "A_".$vandaag.".html"; 
$saveCsvName = "A_".$vandaag.".csv"; 
parse_page(); 

$saveFileName = "B_".$vandaag.".html"; 
$saveCsvName = "B_".$vandaag.".csv"; 
parse_page(); 
+6

你在該程序中使用'嚴格'和'使用警告'嗎?我想你不會。在頂部添加這兩個,然後修復它們會給你的所有錯誤(比如'foreach'中的未聲明'$ add'),然後用更新後的程序編輯你的問題。 – simbabque

+1

如果您無法確定您的字段數據中不會存在字段或行分隔符,請使用[Text :: CSV_XS](http://search.cpan.org/perldoc/Text::CSV_XS)編寫CSV數據。 – reinierpost

+0

我刪除了雙引號,因爲它與我的問題無關。此外,CSV文件的內容也非常好。唯一的問題是第二個文件也有第一個文件的內容... – hetOrakel

回答

5

好,加入use strictuse warnings後,我不得不宣佈一些變量我忘了(在foreach$add只是其中之一)。其中一人非常討厭。但是,解決我的小問題走後....

討厭的一個(在#LC使用未初始化值):橫空出世:

my @adds = $tree->look_down(sub { lc($_[0]->attr('class')) eq 'ad_row' }); 

應該是:

my @adds = $tree->look_down(sub { (defined $_[0]->attr('class')) and lc($_[0]->attr('class')) eq 'ad_row' }); 

支持!

+7

爲什麼'嚴格使用'使用警告'是我認爲的好習慣! :) – Sobrique

+0

哼哼....這種改變不會做任何事情,但沉默虛假的警告。這是你做出的其他改變之一。 – ikegami

+0

你說得對。使用嚴格/警告幫助我刪除所有警告。這解決了問題。我展示了這一個,因爲這對我來說很難修復。 – hetOrakel