几点建议:
始终:
use strict;
use warnings;
这将迫使你与my来声明变量。例如
foreach my $ts ($te->table_states) {
my $cnt = 1;
(warnings将让你了解最愚蠢的错误。strict会要求您使用在某些情况下,更好的做法,防止错误)。
在几个地方,您在使用数组时会使用自己的计数器变量。你不需要这样做。相反,直接获取你想要的数组元素。例如$array[3]得到第三个元素。
Perl还允许数组切片获取所需的某些元素。 @array[4,5,13]获得数组的第五,第六和第十四个元素。你可以用它来处理,而不是通过所有这些循环只有你想要的行:
my @rows = $ts->rows;
foreach my $row (@rows[4,5,13]) #process only the 5th, 6th, and 14th rows.
{
...
}
这里是同样的事情的快捷版本,使用匿名数组:
foreach my $row (@{[$ts->rows]}[4,5,13])
而且,也许你要定义你想要在你的代码的其他地方行:
my @wanted_rows = (4,5,13);
...
foreach my $row (@{[$ts->rows]}[@wanted_rows])
此代码是相当混乱:
$PrintLine= join("\t", @$row);
@RowData=split(/\t/,$PrintLine);
$PrintLine =~ s/\r//ig;
$PrintLine =~ s/\t//ig;
首先,您要加入一个包含制表符的数组,然后您将分裂刚刚加入的数组以重新获取数组。然后,您仍然从行中删除所有制表符。
我建议你摆脱所有的代码。无论何时需要阵列,只需使用@$row,而不是复制它。如果您需要打印调试数组(这是所有你似乎与$PrintLine做,你可以直接打印一个数组:
print @$row; #print an array, nothing between each element.
print "@$row"; #print an array with spaces between each element.
伴随着这些变化,你的代码将是这样的:
use strict;
use warnings;
my @wanted_rows = (4,5,13);
my $te = new HTML::TableExtract(count => 0);
$te->parse($content);
# Examine all matching tables
foreach my $ts ($te->table_states) {
foreach my $row (@{[$ts->rows]}[@wanted_rows]) {
s/[\xC3\xA1\xC3\xA0\xC3\xA2\xC3\xA3\r\n]//ig for (@$row);
my $SiteID = $$row[16] // ''; #set to empty strings if not defined.
my $SiteName = $$row[38] // '';
print MYFILE2 $BridgeCase."\t".$SiteID."\t".$SiteName;
}
}