以数组形式访问返回的值

时间:2015-12-08 15:01:13

标签: arrays perl

我有简单的XML,我想在Perl中读取并使哈希包含所有读取密钥。

考虑以下代码:

Item

当XML文件包含许多$content标记时,此代码段效果很好。然后Item是对数组的引用。但是当只有一个$content时,我在解除引用为数组时会出错。我的假设是d = (double)(a/b); 是对标量的引用,而不是数组。

确保从XML中读取值数组的做法是什么?

3 个答案:

答案 0 :(得分:8)

你需要的是不使用XML::Simple然后它真的是微不足道的。我最喜欢的相当直接的XML样本是XML::Twig

use XML::Twig;
my $twig = XML::Twig -> new -> parsefile ( 'filesmap.xml' ); 

my @files = map { $_ -> trimmed_text } $twig -> get_xpath ( '//Path' ); 

通过更详细的XML示例(以及期望的结果),我将能够为您提供更好的答案。

XML::Simple的部分问题是它试图将XML数据结构转换为perl数据结构,并且 - 因为哈希是键值而无序但是数组是有序的,它不得不猜。有时它做错了,有时则不一致。

如果您希望它保持一致,可以设置:

my $xml = XMLin( "filesmap.xml", ForceArray => 1, KeyAttr => [], ForceContent => 1 );

但实际上 - XML::Simple只是一条痛苦的途径。不要使用它。如果您不喜欢XML::Twig,请尝试使用XML::LibXML

答案 1 :(得分:1)

我要说的是展平 - 步骤。

my %files 
    = map { $_->{Path} => 1 } 
      # flatten...
      map { ref() eq 'ARRAY' ? @$_ : $_ } 
      $xml->XMLin("filesmap.xml")->{Item}
    ;

答案 2 :(得分:1)

如有必要,您可以检查并强制返回数组引用:

my $content = $xml->XMLin("filesmap.xml")->{Item};

$content = ref $content eq 'ARRAY'
    ? $content
    : [$content];