It didn't turn apple into an array with sqr brackets. It returned a hash. Exactly what I wanted. A hash all the time for one or two elements. I was surprised to get a hash because I would have expected sqr brackets from ForceArray.
This really seems like odd behavior but I'll take it. It's exactly what I wanted.
Take this updated code for example:
use strict;
use XML::Simple;
use Data::Dumper;
my $text=<<EOF;
<main>
<apple name="date" value="1231210"/>
<apple name="time" value="235959"/>
<cookies name="date" value="1231210"/>
<cookies name="time" value="235959"/>
<banana name="date" value="1231210"/>
<butter name="date" value="1231210"/>
<orange>one</orange>
<milk>one</milk>
<grape>one</grape>
<grape>two</grape>
</main>
EOF
my $p1 = new XML::Simple();
my $tree;
my $config = eval {
$tree= $p1->XMLin($text,
,ForceArray => ['banana','apple','orange'] # bingo!!!
)
};
die("$@\n Ending") if ($@);
print "\$tree " . Dumper(\$tree) . "\n";
exit 0;
Unlike Milk, when I put orange into the ForceArray I get sqr brackets. Orange doesn't have an attribute but Banana does. Cookies goes right to a hash without doing anything because there are two of them.
- x - x - x - x - x - x - x - x -
$tree $VAR1 = \{
'cookies' => {
'time' => {
'value' => '235959'
},
'date' => {
'value' => '1231210'
}
},
'banana' => {
'date' => {
'value' => '1231210'
}
},
'apple' => {
'time' => {
'value' => '235959'
},
'date' => {
'value' => '1231210'
}
},
'orange' => [
'one'
],
'butter' => {
'value' => '1231210',
'name' => 'date'
},
'grape' => [
'one',
'two'
],
'milk' => 'one'
};
- x - x - x - x - x - x - x - x -
Once again. Thanks for the tip. I wouldn't have attempted that.
|