【发布时间】:2014-01-20 13:35:40
【问题描述】:
我正在尝试运行一个 perl 脚本,其中构建了一些树枝。 此脚本应获取 xml 文件并返回作为文件中的属性存在的版本号。 每次我尝试解析一个大文件(23 MB)时,脚本都会崩溃并显示以下内容 -
"Child 341 terminated with signal 11".
调用将获得所需属性的子例程的代码-
my $version = $strm_obj->get_attr(file=>$file1,tag=>"config",attr=>"contentversion");
print "Version of $file1 is $version \n";
my $globalversion = $strm_obj->get_attr(file=>$file2,tag=>"config",attr=>"globalcontentversion");
print "Version of $file2 is $globalversion \n";
获取所需属性的子程序 -
sub get_attr{
my ($self,%args) = @_;
my $file = $args{file};
my $tag = $args{tag};
my $attr = $args{attr};
my $val;
$self->{_ATTR} = $attr;
$self->{_TAG} = $tag;
test_log(DEBUG,"Value of tag is $tag, attribute is $attr");
my $twig= XML::Twig->new(
twig_roots => { $tag
=> sub {$self->get_attr_helper(@_,$tag,\$val); } } )
->parsefile($file);
if ($val){
test_log(INFO,"value of attribute $attr is $val");
}
if (!$val){
test_log(INFO,"The attribute $attr that you are looking for, is not present in $file");
return -1;
}
$twig->purge;
$twig->dispose;
return $val;
}
sub get_attr_helper{
my($self,$obj,$tag,$act_tag,$val) = @_;
my $attr = $self->{_ATTR};
#print "my attr is $attr\n";
for my $node ($tag->findnodes("//$self->{_TAG}")){
if ($node->att("$attr")){
$$val = $node->att("$attr");
}
}
$obj->purge;
}
xml文件的格式如下:
$file1 -
<config contentversion="378">
<tag1>
.
.
.
<tag n>
</config>
$file2 -
<config globalcontentversion="378">
<tag1>
.
.
.
<tag n>
</config>
我不能在这里提供实际的 xml 文件。
我知道这个脚本最多消耗我机器的大约 20% 的内存(2GB RAM)。
我环顾四周,找不到解决办法。
如何消除段错误?
【问题讨论】:
-
您的程序是否会因
twig_roots => { '/config' => 1 } }等更简单的内容而崩溃? -
您希望您的脚本有什么样的输出?看起来您正在获取单个元素然后丢弃其余元素?
标签: xml perl xml-parsing segmentation-fault xml-twig