2016-07-05 58 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