Вывод eXML-PARSER содержит нежелательные ссылки на хеш - PullRequest
0 голосов
/ 21 декабря 2010

Итак, я написал подпрограмму синтаксического анализатора, чтобы взять один файл 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-строки не нужны, пожалуйста, сообщите.

1 Ответ

2 голосов
/ 21 декабря 2010
$record = {};

устанавливает $record для ссылки на пустой хеш. Но везде вы воспринимаете $record как строку и добавляете ее. Когда вы обрабатываете хеш-ссылку как строку, вы получаете строку типа HASH(0x19f9b58) (число варьируется).

Вы, вероятно, имели в виду

$record = q{};

который устанавливает $record в пустую строку (просто используя альтернативные кавычки ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...