2

ディレクトリ内の各 xml ファイルの文字列「kcat」を含むすべての HTML テーブルを印刷しようとしていますが、問題が発生しています。ディレクトリ内の各ファイル (kcat_tables という名前) には、kcat を含む HTML テーブルが少なくとも 1 つあることに注意してください。このプログラムを 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言語にかなり慣れていないので、シンプルでわかりやすい回答をいただければ幸いです。

4

1 に答える 1

0

次のように、正規表現をオブジェクトに適用することはできません。

if ( $ts =~ /kcat/i ) {

「ツリー」モードでテーブルを解析することをお勧めします。このためには、HTML::TreeBuilder と HTML::ElementTable という 2 つの追加の perl モジュールをインストールする必要があります。次のように有効にします。

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 オブジェクトです。上記のコードはサンプルで動作します。

于 2015-02-16T16:38:57.750 に答える