【问题标题】:HTML::TableExtract - passing an expression for headersHTML::TableExtract - 传递标题的表达式
【发布时间】:2013-06-11 23:19:45
【问题描述】:

我有一个通过另一个脚本调用的子例程来读取 HTML 文件。下面是代码。

sub read_html
{
    $data=`cat "$_[0]"`;
    use HTML::TableExtract;
    print "CALLING read_html to read $_[0]\n";
    #my $self = shift;
    print "$_[1]";
    $te = HTML::TableExtract->new( headers => [($_[1])] );
    $te->parse($data);
    my $line_cnt=0;
    # Examine all matching tables
    foreach $ts ($te->tables)
    {
        if ($ts->rows ne "")
        {
            foreach $row ($ts->rows)
            {
                foreach (@$row) { $_='' unless defined $_; }
                print @$row;
                if (@$row[0] ne ' '  and @$row[0] ne ''  and
                    @$row[0] ne "\n" and @$row[0] ne "\t")
                {
                    $line_cnt++;
                }
            }
        }
        return $line_cnt;
    }
}

当我运行上面的脚本时,当标题作为变量传递时,它没有显示 HTML 表格数据。

$te = HTML::TableExtract->new( headers => [($_[1])] );

但是,如果我将表达式 $_[1] 替换为如下所示的硬编码值,它将返回指定标题下的所有列值

$te = HTML::TableExtract->new(
    headers => [("PO Number",
                 "Invoice Number",
                 "DC Number",
                 "Store Number",
                 "Invoice Amount",
                 "Discount",
                 "Amount Paid")] );

我将子例程称为read_html($file, $headers),其中$file 是文件名,$headers 保存标头值,逗号分隔。

任何帮助将不胜感激。

【问题讨论】:

    标签: perl html-table html-tableextract


    【解决方案1】:

    我将子程序调用为 read_html($file, $headers) where $file 是一个文件名和 $headers 作为标头值逗号分隔。

    HTML::TableExtract->new 的 headers 参数需要一个对字符串数组的引用,其中每个字符串都是一个单独的标题。听起来您是在向它传递对包含逗号字符的单个字符串的数组的引用。

    my @headers = split m(\s*,\s*), $_[1];
    $te = HTML::TableExtract->new( headers => \@headers );
    

    如果这不正确,那么您的问题需要更具体地说明您如何调用read_html

    【讨论】:

    • 谢谢,你是对的,我用一个包含逗号字符的字符串来调用它。
    • 谢谢,你是对的,我用一个包含逗号字符的字符串来调用它。但是我按照您的建议将其转换为数组后尝试调用它,但结果是相同的。当作为数组引用传递时,它不会返回任何东西。
    • 我确实发现了问题,在调用子例程时,我在双引号“”中传递了值,所以当我将相同的值转换为数组时,它会使用这些不匹配的引号与文件的标题。我删除了“”,它工作得很好。谢谢
    • @YordanGeorgiev 当然,开始赏金,然后在 24 小时宽限期后奖励它 LOL ;) 很高兴能提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多