Arrays Perl,使用XML::Simple解析XML,但存在问题
我正在用Perl解析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>
<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
}
我尝试了这个,但是它将所有哈希设置为数组。还有什么我能做的吗?我试过了,但是它把所有的散列都设置为数组。还有什么我能做的吗?