所以我编写了一个解析器例程来获取一个xml文件并重新分析到另一个文件。我后来修改了这段代码,将一个大的xml文件拆分成许多小的xml文件。
我遇到输出问题。解析工作正常唯一的输出还包括不需要的字符串,如HASH(0x19f9b58),我不知道为什么,需要一组友好的眼睛。
use Encode;
use XML::Parser;
my $parser = XML::Parser->new( Handlers => {Start => \&handle_elem_start,
End => \&handle_elem_end,Char => \&handle_char_data,});
my $record;
my $file = shift @ARGV;
if( $file ) {$parser->parsefile( $file );}
exit;
sub handle_elem_start
{
my( $expat, $name, %atts ) = @_;
if ($name eq 'articles'){$file="_data.xml";unlink($file);}
$record .= "<";
$record .= "$name";
foreach my $key (keys %atts){$record .= " $key=\"$atts{$key}\"";}
$record .= ">";
}
sub handle_char_data
{
my( $expat, $text ) = @_;
$text = decode_utf8( $text );
$record .= "$text";
}
sub handle_elem_end
{
my( $expat, $name ) = @_;
$record .= "</$name>";
if( $name eq 'article' )
{
open (MYFILE, '>>'.$file);
print MYFILE $record;
close (MYFILE);
print $record;
$record = {};
}
return unless( $name eq 'article' );
}
示例输出:
...
</article>HASH(0x19f9b40)
<article doi="10.1103/PhysRevSeriesI.9.304">
<journal short="Phys. Rev. (Series I)" jcode="PRI">Physical Review (Series I)</journal>
<volume>9</volume>
<issue printdate="1899-11-00">5</issue>
<fpage>304</fpage>
<lpage>309</lpage>
<seqno>1</seqno>
<price></price><tocsec>Articles</tocsec>
<arttype type="article"></arttype><doi>10.1103/PhysRevSeriesI.9.304</doi>
<title>An Investigation of the Magnetic Qualities of Building Brick</title>
<authgrp>
<author><givenname>O.</givenname><middlename>A.</middlename><surname>Gage</surname></author>
<author><givenname>H.</givenname><middlename>E.</middlename><surname>Lawrence</surname></author>
</authgrp>
<cpyrt>
<cpyrtdate date="1899"></cpyrtdate><cpyrtholder>The American Physical Society</cpyrtholder>
</cpyrt>
</article>HASH(0x19f9b58)
...
不需要HASH字符串,请指教。
答案 0 :(得分:2)
$record = {};
将$record
设置为包含对空哈希的引用。但在其他任何地方,您都将$record
视为字符串,并附加到其中。当您将hashref视为字符串时,您会得到一个类似HASH(0x19f9b58)
的字符串(数字会有所不同)。
你可能意味着
$record = q{};
将$record
设置为空字符串(仅使用alternate quotes)。