我尝试为目录中的每个xml文件打印包含字符串"kcat“的所有HTML表,但遇到了一些问题。请注意,目录(名为kcat_tables)中的每个文件至少有一个包含kcat的HTML表。我在一个ubuntu虚拟机上运行这个程序。下面是我的代码:
#!/usr/bin/perl
use warnings;
use strict;
use File::Slurp;
use Path::Iterator::Rule;
use HTML::TableExtract;
use utf8::all;
my @papers_dir_path = qw(/home/bob/kinase/kcat_tables);
my $rule = Path::Iterator::Rule->new;
$rule->name("*.nxml");
$rule->skip_dirs(".");
my $xml;
my $it = $rule->iter(@papers_dir_path);
while ( my $file = $it->() ) {
$xml = read_file($file);
my $te = HTML::TableExtract->new();
$te->parse($xml);
foreach my $ts ( $te->tables ) {
if ( $ts =~ /kcat/i ) {
print "Table (", join( ',', $ts->coords ), "):\n";
foreach my $row ( $ts->rows ) {
print join( ',', @$row ), "\n";
}
}
}
}我该怎么解决这个问题有什么建议吗?提前感谢!另外,我是PERL语言的新手,所以如果能给出一个简单易懂的答案,我将非常感激。
发布于 2015-02-17 00:38:58
不能将正则表达式应用于对象,如中所示:
if ( $ts =~ /kcat/i ) {我建议在“树”模式下解析表。为此,您必须安装两个额外的perl模块: HTML::TreeBuilder和HTML::ElementTable。像这样启用它:
use HTML::TableExtract 'tree';下面是修复后的while循环:
while ( my $file = $it->() ) {
$xml = read_file($file);
my $te = HTML::TableExtract->new();
$te->parse($xml);
foreach my $ts ( $te->tables ) {
my $tree = $ts->tree or die $!;
if ( $tree->as_text =~ /kcat/i ) {
print "Table (", join( ',', $ts->coords ), "):\n";
# update 18.2.2015: pretty print the table
foreach my $row ($ts->rows) {
print join ' | ', map {sprintf "%22s", $_->as_text} @{$row};
print "\n";
# which is the same as
# foreach my $cell (@${$row}) { do something with $cell->as_text }
}
}
}
}$tree是一个HTML::ElementTable对象。上面的代码适用于您的示例。
https://stackoverflow.com/questions/28511438
复制相似问题