Perl从HTML表打印行和列

时间:2013-09-12 17:53:45

标签: perl html-table html-tableextract

这是我的temp.html

<table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>

我正在尝试使用以下代码打印上表中的每个元素 -

#!/usr/bin/perl

use strict;
use Data::Dumper;
use HTML::TableExtract;

my $tex = HTML::TableExtract->new(keep_html=>1);

$tex->parse_file('./temp.html');
my ($table) = $tex->tables;
#print Dumper($table);

my $numColumns = @{$table->rows->[0]};
print "\n numColumns = $numColumns\n";
my $numRows = @{$table->rows};
print "\n numRows = $numRows\n";

for my $rowIndex ( 0..$numRows-1 ) { 
    for my $columnIndex ( 0..$numColumns-1 ) { 
       print "\n row $rowIndex column $columnIndex $table->rows->[$rowIndex][$columnIndex] ";
    }   
}

打印 -

row 0 column 0 HTML::TableExtract::Table=HASH(0x8e7d7f8)->rows->[0][0] 
row 0 column 1 HTML::TableExtract::Table=HASH(0x8e7d7f8)->rows->[0][1] 
row 1 column 0 HTML::TableExtract::Table=HASH(0x8e7d7f8)->rows->[1][0] 
row 1 column 1 HTML::TableExtract::Table=HASH(0x8e7d7f8)->rows->[1][1]

如果我使用@{$table->rows->[$rowIndex]}->[$columnIndex]代替$table->rows->[$rowIndex][$columnIndex],我会得到正确的输出,但会收到警告。 如何删除警告?

Using an array as a reference is deprecated at t.pl line 21.

row 0 column 0 row 1, cell 1 
row 0 column 1 row 1, cell 2 
row 1 column 0 row 2, cell 1 
row 1 column 1 row 2, cell 2

2 个答案:

答案 0 :(得分:2)

你不能在字符串中调用方法。虽然您可以取消引用字符串中的变量并且也可以从哈希或数组访问元素,但不支持方法调用。

而不是

print "... $table->rows->[$rowIndex][$columnIndex] ";

你想要

my $cell_value = $table->rows->[$rowIndex][$columnIndex];
print "... $cell_value ";

其他替代方案包括使用某种解除引用。你找到了像

这样的解决方案
print "... ${$table->rows->[$rowIndex]}[$columnIndex] ";

这是有效的,因为方法调用现在在一个解除引用的块中,可以包含任意代码。更常见的方法是使用“购物车”伪运算符@{[ ... ]},它允许插入任意代码:

print "... @{[ $table->rows->[$rowIndex][$columnIndex] ]} ";

答案 1 :(得分:0)

想出来。

根据https://stackoverflow.com/a/14065917/1729501

@Month_name->[$month] 

应该是

$Month_name[$month]

所以在我的情况下,

@{$table->rows->[$rowIndex]}->[$columnIndex]

应该是

${$table->rows->[$rowIndex]}[$columnIndex]