Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 以数组形式访问返回值_Arrays_Perl - Fatal编程技术网

Arrays 以数组形式访问返回值

Arrays 以数组形式访问返回值,arrays,perl,Arrays,Perl,我有一个简单的XML,我想在Perl中读取,并生成包含所有读取键的哈希 考虑以下代码: my $content = $xml->XMLin("filesmap.xml")->{Item}; my %files = map { $_->{Path} => 1 } @$content; 当XML文件包含许多Item标记时,此代码段非常有用。然后,$content是对数组的引用。但当只有一个项时我会在取消引用为数组时出错。我的假设是,$content是对标量的引用,而不是数组

我有一个简单的XML,我想在Perl中读取,并生成包含所有读取键的哈希

考虑以下代码:

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)。