这是我的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 = $numColumnsn";
my $numRows = @{$table->rows};
print "n numRows = $numRowsn";
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
不能在字符串中调用方法。虽然您可以取消引用字符串中的变量,也可以访问哈希或数组中的元素,但不支持方法调用。
而不是
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] ]} ";
通了。
根据 https://stackoverflow.com/a/14065917/1729501
@Month_name->[$month]
应该是
$Month_name[$month]
所以就我而言,
@{$table->rows->[$rowIndex]}->[$columnIndex]
应该是
${$table->rows->[$rowIndex]}[$columnIndex]