取消对XML::简单哈希的引用

取消对XML::简单哈希的引用,xml,perl,Xml,Perl,我有一个如下所示的XML文件 <booklist> <book type="technical"> <author>Book 1 author 1</author> <author>Book 1 author 2</author> <title>Book 1 title</title> <isbn>Book1ISBN</isbn&

我有一个如下所示的XML文件

<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <author>Book 1 author 2</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>
这是转储文件:

/tmp/walt $ /tmp/walt/bookparse_by_attrib.pl
$VAR1 = {
          'book' => [
                    {
                      'isbn' => 'Book1ISBN',
                      'title' => 'Book 1 title',
                      'author' => [
                                  'Book 1 author 1',
                                  'Book 1 author 2'
                                ],
                      'type' => 'technical'
                    },
                    {
                      'isbn' => 'Book2ISBN',
                      'title' => 'Book 2 title',
                      'author' => [
                                  'Book 2 author 1',
                                  'Book 2 author 2'
                                ],
                      'type' => 'fiction'
                    },
                    {
                      'isbn' => 'Book3ISBN',
                      'title' => 'Book 3 title',
                      'author' => [
                                  'Book 3 author 1',
                                  'Book 3 author 2',
                                  'Book 3 author 3'
                                ],
                      'type' => 'technical'
                     }
                   ]
        };
然而,当我试着把作者打印出来的时候——这就是我得到的

foreach $book (@{$booklist->{book}} ) {
     print $book->{author}  ;
     print "\n";
}

ARRAY(0x249a140)
ARRAY(0x249a098)
ARRAY(0x2499fc0)

如何打印author?

由于author键是一个数组引用,您也需要取消引用它们:

foreach my $book ( @{ $booklist->{ book } } ) {
    foreach my $author ( @{ $book->{ author } } ) {
        print "$author\n";
    }
}

由于author键是一个数组引用,因此您也需要取消引用它们:

foreach my $book ( @{ $booklist->{ book } } ) {
    foreach my $author ( @{ $book->{ author } } ) {
        print "$author\n";
    }
}

在该数据结构中,作者指向一个数组引用。因此,在打印之前,您需要对数组进行迭代或取消引用:

foreach $book (@{$booklist->{book}} ) {
     print "@{$book->{author}}\n";
}
但是,我建议您使用比XML更好的XML解析模块。这是模块本身的建议:

本模块的状态 不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别是,强烈建议使用

该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果

带有bug修复和文档修复的补丁是受欢迎的,但不太可能添加新功能

当前,如果您有一个只有一个作者的记录,它将引用标量而不是数组。这可以通过
XML::Simple
中的选项进行调整,但老实说,这并不值得

相反,我建议使用更好的模块,如或,以避免解析中的不一致:

use strict;
use warnings;

use XML::LibXML;

my $data = do {local $/; <DATA>};

my $xml = XML::LibXML->load_xml(string => $data);

for my $book ($xml->findnodes('//book')) {
    my $title = $book->findvalue('title');
    print "Title = '$title'\n";

    for my $author ($book->findnodes('author')) {
        print "   " . $author->textContent() . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>

在该数据结构中,作者指向一个数组引用。因此,在打印之前,您需要对数组进行迭代或取消引用:

foreach $book (@{$booklist->{book}} ) {
     print "@{$book->{author}}\n";
}
但是,我建议您使用比XML更好的XML解析模块。这是模块本身的建议:

本模块的状态 不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别是,强烈建议使用

该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果

带有bug修复和文档修复的补丁是受欢迎的,但不太可能添加新功能

当前,如果您有一个只有一个作者的记录,它将引用标量而不是数组。这可以通过
XML::Simple
中的选项进行调整,但老实说,这并不值得

相反,我建议使用更好的模块,如或,以避免解析中的不一致:

use strict;
use warnings;

use XML::LibXML;

my $data = do {local $/; <DATA>};

my $xml = XML::LibXML->load_xml(string => $data);

for my $book ($xml->findnodes('//book')) {
    my $title = $book->findvalue('title');
    print "Title = '$title'\n";

    for my $author ($book->findnodes('author')) {
        print "   " . $author->textContent() . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>

我将删除我的答案,+1表示解释得很好的答案。哇哦!很长一段时间以来,我一直在说远离这个模块。我不知道模块现在也这么说了@hwnd-我在周五看到了你的答案,看起来不错-我更喜欢你的方法,因为这个商店没有XML::LibXML。获取一个新模块的过程涉及到系统管理员的大量许可和票据。我必须使用XML::Simple for now-bugs和所有工具。@hwnd-请随时转发您的答案-或在列出的地址与我联系。我将删除我的答案,+1表示解释清楚的答案。哇哦!很长一段时间以来,我一直在说远离这个模块。我不知道模块现在也这么说了@hwnd-我在周五看到了你的答案,看起来不错-我更喜欢你的方法,因为这个商店没有XML::LibXML。获取一个新模块的过程涉及到系统管理员的大量许可和票据。我必须使用XML::Simple for now-bugs和所有内容。@hwnd-请随时转发您的答案-或随时与我联系列出的地址。