首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印多个文件中包含特定字符串的所有HTML表(perl)

打印多个文件中包含特定字符串的所有HTML表(perl)
EN

Stack Overflow用户
提问于 2015-02-14 09:27:25
回答 1查看 193关注 0票数 2

我尝试为目录中的每个xml文件打印包含字符串"kcat“的所有HTML表,但遇到了一些问题。请注意,目录(名为kcat_tables)中的每个文件至少有一个包含kcat的HTML表。我在一个ubuntu虚拟机上运行这个程序。下面是我的代码:

代码语言:javascript
复制
#!/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语言的新手,所以如果能给出一个简单易懂的答案,我将非常感激。

EN

回答 1

Stack Overflow用户

发布于 2015-02-17 00:38:58

不能将正则表达式应用于对象,如中所示:

代码语言:javascript
复制
if ( $ts =~ /kcat/i ) {

我建议在“树”模式下解析表。为此,您必须安装两个额外的perl模块: HTML::TreeBuilder和HTML::ElementTable。像这样启用它:

代码语言:javascript
复制
use HTML::TableExtract 'tree';

下面是修复后的while循环:

代码语言:javascript
复制
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对象。上面的代码适用于您的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28511438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档