PERL:脚本未完成

时间:2013-11-02 16:54:40

标签: mysql xml perl

我已经有这个剧本已经有两年多的时间了,而且直到两周前我都没有任何问题,而且我也不知道为什么它会突然停止完成。

每天服务器都会下载并解压缩一个大的xml文件(平均109,000条记录,如下例所示。)然后脚本将从xml文件转移到mysql数据库进行存储和更简单的查询。

<ACCOUNT>
 <NAME>Name</NAME>
 <TYPE>Pretitle</TYPE>
 <FULLNAME>Fullname</FULLNAME>
 <MOTTO>Motto</MOTTO>
 <CATEGORY>Account Category</CATEGORY>
</ACCOUNT>

正如我所说,我已经两年多没有问题,但过去两周它在68,000(平均更多或更少)记录被转移后停止,我真的想知道原因。这是一个直接传输,我已经确认在xml文件中找到了超过68,000条记录。

这是有问题的脚本。如果任何人都可以验证这是一个可靠的脚本还是有问题,我会非常感激。我完全失去了。

#!/usr/bin/perl
print "Content-type: text/html; charset=iso-8859-1\n\n";
use strict;
use DBI;
use XML::Parser;
my %row = ("NAME" => undef, "TYPE" => undef, "FULLNAME" => undef, "MOTTO" => undef, "CATEGORY" => undef);
my $dbh = DBI->connect ("DBI:mysql:database:localhost", "username", "password",
                       { RaiseError => 1, PrintError => 0});
my $parser = new XML::Parser (
                       Handlers => {
                           Start => \&handle_start,
                           End   => \&handle_end,
                           Char  => \&handle_text
                       }
                   );
$parser->parsefile ("accounts.xml");
$dbh->disconnect ();
sub handle_start
{
my ($p, $tag) = @_;   
   if ($tag eq "ACCOUNT")
   {
       foreach my $key (keys (%row))
       {
           $row{$key} = undef;
       }
   }
}

sub handle_text
{
my ($p, $data) = @_;      
   my $tag = $p->current_element ();
   $row{$tag} .= $data if exists ($row{$tag});
}

sub handle_end
{
my ($p, $tag) = @_;  
   if ($tag eq "ACCOUNT")
   {
       my $str;
       foreach my $key (keys (%row))
       {
           $str .= "," if $str;
           $str .= "$key=" . $dbh->quote($row{$key});
       }
       $dbh->do ("INSERT INTO TABLE SET $str");
   }
}

1 个答案:

答案 0 :(得分:0)

将插入的代码放在&#34; eval {};&#34;部分。然后在脚本末尾打印$ @。

这将a)表示异常被捕获并且脚本可以完成(很可能没有相关行)和b)您可以从$ @的内容中看到令您烦恼的脚本。