Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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 Perl,使用XML::Simple解析XML,但存在问题_Arrays_Perl_Hash_Xml Parsing_Xml Simple - Fatal编程技术网

Arrays Perl,使用XML::Simple解析XML,但存在问题

Arrays Perl,使用XML::Simple解析XML,但存在问题,arrays,perl,hash,xml-parsing,xml-simple,Arrays,Perl,Hash,Xml Parsing,Xml Simple,我正在用Perl解析xml文件,在一个问题上似乎一切都很好。我有相同模式的文件,但它们从解析器返回不同类型的数据。以下是一个简化的示例: <tests> <test> <data1>Hi</data1> <data2>Hello</data2> </test> <test> <data1>

我正在用Perl解析xml文件,在一个问题上似乎一切都很好。我有相同模式的文件,但它们从解析器返回不同类型的数据。以下是一个简化的示例:

<tests>
       <test>
          <data1>Hi</data1>
          <data2>Hello</data2>
       </test>
       <test>
          <data1>Hi2</data1>
          <data2>Hello2</data2>
       </test>
  </tests>
现在,对于一组类似的数据,但只有一个“测试”实体,如下所示:

  <tests>
       <test>
          <data1>Hi</data1>
          <data2>Hello</data2>
       </test>
  </tests>
我的困境是,我的代码期望在那里有一个数组,因为这是规范。但当只有一个实体时,它很可能会返回该实体的哈希值。我的问题是,如何像处理数组一样处理散列实体。还是测试一下

现在,我检索数组的代码如下所示:

foreach $test (@{$data->{'tests'}->{'test'}})
{
   do something with $test
}

但对于散列,它给出了一个错误“不是数组引用”。我希望这是足够的细节!谢谢

您需要使用哈希符号“%s”来取消对哈希的引用。

您需要使用哈希符号“%s”来取消对哈希的引用。

此选项应设置为“1”,以强制嵌套元素 即使只有一个数组也表示为数组

此选项应设置为“1”,以强制嵌套元素 即使只有一个数组也表示为数组


也许
ForceArray
选项的另一种形式就是您想要的

ForceArray=>[名称]

此“ForceArray”选项的替代(和首选)形式 允许您指定元素名称列表,这些名称应始终为 强制进入数组表示,而不是“全部或无” 上面的方法

也可以(自版本2.05起)包含编译的常规 列表中的表达式-与模式匹配的任何元素名称 将被强制添加到阵列。如果列表只包含一个正则表达式, 那么就没有必要将其包含在arrayref中。例如:

ForceArray=>qr/\u列表$/

所以我可以试试:

ForceArray => ['test']

也许
ForceArray
选项的另一种形式就是您想要的

ForceArray=>[名称]

此“ForceArray”选项的替代(和首选)形式 允许您指定元素名称列表,这些名称应始终为 强制进入数组表示,而不是“全部或无” 上面的方法

也可以(自版本2.05起)包含编译的常规 列表中的表达式-与模式匹配的任何元素名称 将被强制添加到阵列。如果列表只包含一个正则表达式, 那么就没有必要将其包含在arrayref中。例如:

ForceArray=>qr/\u列表$/

所以我可以试试:

ForceArray => ['test']

虽然看起来可以使XML解析器的行为更加一致,但让代码在变量输出上工作也不难

Perl内置函数“ref”可用于确定引用的对象类型

您的原始代码将被删除

foreach $test (@{$data->{'tests'}->{'test'}})
{
    do something with $test
}
(与编写$data->{'tests'}->{'test'}不同,我倾向于使用更紧凑的$$data{tests}{test},因此我将在我的示例中使用它。)

我们可以检查引用类型,并使用它将所有可能性推送到一个数组中,因此

foreach $test (
    (ref($$data{tests}{test}) eq 'ARRAY') ? (
        @{$$data{tests}{test}}
    ) : (
        $$data{tests}{test}
    )
)
{
    do something with $test
}

虽然看起来可以使XML解析器的行为更加一致,但让代码在变量输出上工作也不难

Perl内置函数“ref”可用于确定引用的对象类型

您的原始代码将被删除

foreach $test (@{$data->{'tests'}->{'test'}})
{
    do something with $test
}
(与编写$data->{'tests'}->{'test'}不同,我倾向于使用更紧凑的$$data{tests}{test},因此我将在我的示例中使用它。)

我们可以检查引用类型,并使用它将所有可能性推送到一个数组中,因此

foreach $test (
    (ref($$data{tests}{test}) eq 'ARRAY') ? (
        @{$$data{tests}{test}}
    ) : (
        $$data{tests}{test}
    )
)
{
    do something with $test
}

我尝试了这个,但是它将所有哈希设置为数组。还有什么我能做的吗?我试过了,但是它把所有的散列都设置为数组。还有什么我能做的吗?