Arrays 以数组形式访问返回值
我有一个简单的XML,我想在Perl中读取,并生成包含所有读取键的哈希 考虑以下代码:Arrays 以数组形式访问返回值,arrays,perl,Arrays,Perl,我有一个简单的XML,我想在Perl中读取,并生成包含所有读取键的哈希 考虑以下代码: my $content = $xml->XMLin("filesmap.xml")->{Item}; my %files = map { $_->{Path} => 1 } @$content; 当XML文件包含许多Item标记时,此代码段非常有用。然后,$content是对数组的引用。但当只有一个项时我会在取消引用为数组时出错。我的假设是,$content是对标量的引用,而不是数组
my $content = $xml->XMLin("filesmap.xml")->{Item};
my %files = map { $_->{Path} => 1 } @$content;
当XML文件包含许多Item
标记时,此代码段非常有用。然后,$content
是对数组的引用。但当只有一个项时
我会在取消引用为数组时出错。我的假设是,$content
是对标量的引用,而不是数组
确保从XML读取值数组的做法是什么?我想说的是,您需要一个展平步骤
my %files
= map { $_->{Path} => 1 }
# flatten...
map { ref() eq 'ARRAY' ? @$_ : $_ }
$xml->XMLin("filesmap.xml")->{Item}
;
我想说的是,您需要一个展平步骤
my %files
= map { $_->{Path} => 1 }
# flatten...
map { ref() eq 'ARRAY' ? @$_ : $_ }
$xml->XMLin("filesmap.xml")->{Item}
;
如果需要,可以执行检查并强制返回到数组引用中:
my $content = $xml->XMLin("filesmap.xml")->{Item};
$content = ref $content eq 'ARRAY'
? $content
: [$content];
如果需要,可以执行检查并强制返回到数组引用中:
my $content = $xml->XMLin("filesmap.xml")->{Item};
$content = ref $content eq 'ARRAY'
? $content
: [$content];
你需要的是不使用,然后它真的很琐碎。对于相当简单的XML示例,我最喜欢的是 有了更详细的XML示例(以及期望的结果),我将能够给您一个更好的答案
XML::Simple
的部分问题在于它试图将XML数据结构转换为perl数据结构,并且-因为散列是键值且无序,但数组是有序的,所以它必须猜测。有时它做错了,有时又不一致
如果希望保持一致,可以设置:
my $xml = XMLin( "filesmap.xml", ForceArray => 1, KeyAttr => [], ForceContent => 1 );
但实际上-
XML::Simple
只是一条痛苦之路。不要用它。如果您不喜欢XML::Twig
,请尝试XML::LibXML
你需要的是不要使用,然后它就真的很琐碎了。对于相当简单的XML示例,我最喜欢的是
有了更详细的XML示例(以及期望的结果),我将能够给您一个更好的答案
XML::Simple
的部分问题在于它试图将XML数据结构转换为perl数据结构,并且-因为散列是键值且无序,但数组是有序的,所以它必须猜测。有时它做错了,有时又不一致
如果希望保持一致,可以设置:
my $xml = XMLin( "filesmap.xml", ForceArray => 1, KeyAttr => [], ForceContent => 1 );
但实际上-
XML::Simple
只是一条痛苦之路。不要用它。如果您不喜欢XML::Twig
,请尝试XML::LibXML
第一:然后一切都很好,很简单。给我们一个XML示例,我们将能够给您一个精确的答案。出现的帖子已经回答了我的问题。通常有一种做法是使用ref$content eq'ARRAY'
,我需要确保获得数组,顺便说一句,这很难看,但在我的XML示例中,我可以使用ForceArray参数或使用另一个XML库。谢谢第一:然后一切都很好,很简单。给我们一个XML示例,我们将能够给您一个精确的答案。出现的帖子已经回答了我的问题。通常有一种做法是使用ref$content eq'ARRAY'
,我需要确保获得数组,顺便说一句,这很难看,但在我的XML示例中,我可以使用ForceArray参数或使用另一个XML库。谢谢就我个人而言,我会颠倒逻辑:ref$content eq‘ARRAY’$内容:[$content]
或者你知道,打开ForceArray
(或者首先不要使用XML::Simple)。就个人而言,我会颠倒逻辑:ref$content eq'ARRAY'$content:[$content]
或者你知道,打开ForceArray
(或者首先不要使用XML::Simple)。